NutzCN Logo
问答 以JSON格式返回结果给JSP,如何避免被IE认为是下载
发布于 184天前 作者 qq_7fafbecc 272 次浏览 复制 上一个帖子 下一个帖子
标签:

问题描述:
登录页面,中间层验证通过后,会以JSON格式返回结果给页面,如果也看到code=1,表示成功,可以跳转到主页面。
以上流程在Chrome、fireFox下都没问题,在IE下变成下载JSON文件的提示。
如何解决?
查看了过往回复,是在MainSetup或其他SetupBy中引用的类的init方法里面加, 例如:

public void init(NutConfig nc) {
    UTF8JsonView.CT = "text/plain";
    // 其他代码
}

问题是,我在MainSetup中加了以后,其他地方都出现的不正常,能否只在登录验证一个方法中加入呢?

附上登录代码:

@At("/login")
	public Object login(@Param("loginName")String loginName,@Param("loginPwd")String loginPwd,@Param("loginMode")String loginMode) {
		System.out.println(loginName + " - " + loginPwd);
		NutMap map = new NutMap();  
		map.put("loginName", loginName);
		map.put("loginPwd", loginPwd);
		map.put("loginMode", loginMode);
		map = (NutMap)comServices.ExcuteServices("B99.03.11", map);
		Mvcs.getHttpSession().setMaxInactiveInterval(60*60*6);//
		if(map.getString("code").equals(Globals.Code.OK_CODE)) {
			User users = (User)map.get("result");
			setSessionAttr(Globals.SESSION_USER_CODE, users);
			return WriteToClient(Globals.Code.OK_CODE, "/index.jsp");
		} else {
			return map;
		}
	}
public Object WriteToClient(String code, String str) {
		NutMap nutMap = new NutMap();
		nutMap.put("code", code);
		nutMap.put("result", str);
		return nutMap;
	}
 function login(){
	$("#Prompt").hide();
	$('#loginForm').form({
		url : base + "/user/login",
	    onSubmit: function(){
	    	if($.trim($("input#u").val()) == "") {
	    		$("#u").focus();
	    		return false;
	    	}
	    	if($.trim($("input#p").val()) == "") {
	    		$("#p").focus();
	    		return false;
	    	}
	    },
	    success : function(resp){
   			var obj = $.parseJSON(resp);
			if(obj.code != "1") {
				$("#Prompt").html(obj.result);
				$("#Prompt").show();
			} else {
				location.href = base + obj.result;
			}   
	    }
	});
	$('#loginForm').submit();
} 
21 回复

还是有问题:
加之后:

"{"code":"1","result":"/login.jsp"}"

加之前:

code:"1"
result:"/login.jsp"
UTF8JsonView.CT = "text/plain";

加之后登录方法是OK了,但是退出方法报错了,因为格式变了

function toLoginOut() {
				$.messager.confirm('提示', '确认要退出系统吗?', function(r) {
					if(r) {
						$.get(base + "/user/loginOut", function(resp) {
							//$.get方法不需要再转一次json了
							//var obj = $.parseJSON(resp);
							debugger;
							if(resp.code == "1") {
								location.href = base + resp.result;
							} else {
								$.messager.alert('提示:', '退出失败!' + resp.result, 'info', function() {
								});
							}
						});
					}
				});
			}

能不能只对某一个方法起效呢?而不影响其他的地方呢?

就是说

UTF8JsonView.CT = "text/plain";

只对某一个action起效果,不然我全系统的前台都要改JS代码

不会整个网站就一个ajax吧?

那倒不是,很多个请求
但基本上都是这样写的

//$.get方法不需要再转一次json了
							//var obj = $.parseJSON(resp);
							debugger;
							if(resp.code == "1") {
								location.href = base + resp.result;
							} else {
								$.messager.alert('提示:', '退出失败!' + resp.result, 'info', function() {
								});
							}

如果要加在init中,那么所有的前台,都要加上这句话,才能正确解析

var obj = $.parseJSON(resp);

全系统有将近200个这样的请求,咋办啊,难道都要改吗,急死了

其他地方没有下载的问题?? 如果是的话, 可以改一下UTF8JsonView

只需要处理登录的地方吗??

是的,只要改登录的就行了

哦, 那方便, 改成

@Ok("raw")


return Json.toJson(map); 

把UTF8JsonView的修改去掉, login方法改成上面的代码就行

放在这里吗?

function login(){
	$("#Prompt").hide();
	$('#loginForm').form({
		url : base + "/user/login",
	    onSubmit: function(){
	    	if($.trim($("input#u").val()) == "") {
	    		$("#u").focus();
	    		return false;
	    	}
	    	if($.trim($("input#p").val()) == "") {
	    		$("#p").focus();
	    		return false;
	    	}
	    },
	    success : function(resp){
   			var obj = $.parseJSON(resp);
			if(obj.code != "1") {
				$("#Prompt").html(obj.result);
				$("#Prompt").show();
			} else {
				location.href = base + obj.result;
			}   
	    }
	});
	$('#loginForm').submit();
} 

错了,中间层方法,我试试哈

刚试了哈,等录OK了,退出方法也OK了,谢谢兽总哈
明天再仔细试试其他业务方法,看看是否OK

检查发现,业务方法中,也有很多变成下载了,没有别的办法了吗?
只能添加

UTF8JsonView.CT = "text/plain";

后,把前台所有请求的success中加入

var obj = $.parseJSON(resp);

吗?

好像$.ajaxSetup可以统一设置

请教下,具体如何设置$.ajaxSetup

刚试了一下:

 $.ajax({
		type:'POST',
		url:base + "/SysConfig/querySysConfigByCode",
		dataType:"json",
		//data:{'CODE' : 'PXSAVENEXT'},
		//fffff
		success: function(resp){
			debugger;
			MapConfig=resp; 
		}
	});

加上了

dataType:"json"

就算不加

UTF8JsonView.CT = "text/plain";

IE下也正常执行的

那就是ok了?

问题是,我们系统中除了$.ajax,还有大量的$.get 、 $.post 、 $('#xxForm').submit()
这种jquery请求,这种是无法让前台自动识别为json对象的,必须要先手动$.parseJSON转为json对象,才能用
这些没办法,要么改前台,要么改后台,都是全系统改动,这回完蛋了

直接把登录改成表单提交就完了,不用ajax

添加回复
请先登陆
回到顶部