地址栏传参乱码解决方案一例
先明确是地址栏传参、地址栏传参、地址栏传参、、、
即
url = "admin/team/query?key="+value
window.location.href = url
这种
首先,说下前端传来的地址栏参数,
var initParam= $("#id").prev().children(".option-selected").data("value") //var initParam = $("#id").children('option:selected').text() //var initParam = $("#id").val()//三种获取页面数据的情况,根据自己页面的实际情况而定 var encodeParam= encodeURI(encodeURI(initParam)) var query = { "param" : initParam, "param2" : initParam2 } url = "admin/team/query?query="+JSON.stringify(query)//这种要先转成json格式,后台再解析、封装成对象 //url = "admin/team/query?query="+query//后台接收方式:1(Object query)以对象的形式接收地址栏传参,但后台封装不了,后台接收对象的值全为空;2(String query)以String字符串的形式,但这种请求接口时就直接报错,找不到接口 window.location.href = url //window.location.href = encodeURI(encodeURI(url))
其实,对于乱码字段,这里有两种处理方案
1:仅对中文的字段进行 encodeURI(encodeURI(singleParam)) 处理,这样到后台,将jsonString转成对象后,单独将该字段拿出来,反编码,还原成原来的中文(适用于单个参数传递的情况)
2:对整个地址栏参数进行 encodeURI(encodeURI(url)) 处理,这样后台接收到jsonString后,第一时间进行反编码,在封装成对象(适用于对象的情况),但是,但是,
但是,如果想和ajax一样(用这种URL:url = "admin/team/query?query="+query),直接在后台也以对象的形式(接口入参:Object query)接收,后台是接收不到的,数据都是空;
如果用(接口入参:String query)接收,直接报错,貌似传递过程中,不能直接将前端的对象转成String字符串,
所以,在调用接口前,我们要提前在JS里面把对象进行序列化 ,即用JSON.stringify(queryObject) 处理,这样后台就可以以String的入参接收
那么后台怎么进行反编码呢,也很简单:
String chinaStr = URLDecoder.decode(paramJson, "utf8");//注意utf8,有的情况可能需要相应改
paramJson可以是单个参数,也可以是序列化后的参数,只是到后台后需要做对应的处理即可
感想备注:这里主要是要知道如何在前后端进行encode的编码和解码,其次要理解 JSON.stringify() 序列化的作用,
最后,要知道 地址栏传参 和 ajax传参 ,mvc框架的参数的处理能力不同,ajax能自动帮我们处理对象类型的,而地址栏只能以String的形式传参