get请求与post请求的编码格式

场景:页面中查询条件是带入了中文,操作成功后,重定向到另外一个页面,重定向的url如下:

后台把这些值传入后,url会出现乱码,查询失败的场景。

定位原因是:编码格式的问题,get请求

解决方案:1.在method voidBillManage中返回为null,然后前台用ajax post请求voidBillManage,然后在success中再去请求一次queryBillMange.action

2.在voidBillManage方法中进行一次编码  URLEncoder.encode(search_BBM_TRAVELLER, "UTF-8");

 https://blog.csdn.net/smuedward/article/details/51755298

流程:

内容使用GET方式发送,就会在URL后面带上内容,在浏览器发来的请求经过了浏览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码。

这时候想解决中文编码问题有三种方式

    假设:

    url:http://localhost:8080/test?name=测试

    一、在服务器进行处理

      得到的内容是"iso8859-1",使用

        String str = new String(name.getByte("iso8859-1"),"utf-8");

      得到正确的值。

      ps:这种方式有个缺点;这种方式服务器必须默认使用iso8859-1的方式编码,如果我在TOMCAT更改默认的iso8859-1为utf-8,那么这种方式就无法生效了。

    二、在TOMCAT配置文件中设置

      在TOMCAT的目录下conf/server.xml中,搜索"8080"端口,如果改了端口按端口号搜索,搜到之后在这个标签中空格输入 URIEncoding="UTF-8" ,它默认是iso8859-1。

      ps:这种方式缺点显而易见,换了服务器就要更改,有时候忘记也是很常见的事情。

    三、手动编码多一次

      浏览器和服务器传输都是先编码后解码,对中文的支持不太好,那么能不能把中文事先转换成英文或数字传输呢?

      假设:

        1、name=测试,在JS标签中,使用encodeURI(param)方法先将“测试” 转成 name=%26%92(瞎编的)  浏览器再自动进行URI编码 name=%2525%2592(%的URI编码为%25);

          ognl表达式中,使用<s:param name="name" value="%{@java.net.URLEncoder.encode(name,'utf-8')}"> 对值进行URI编码,同时在struts2配置文件中开启静态方法的支持 java.net.URLEncoder.encode()。

          struts.xml: name="struts.ognl.allowStaticMehtodAccess" value="true"

        2、这时候将这链接GET方式提交了

        3、服务器那边得到 name=%26%92 ,我们再使用URIDecoder.decode(name,"utf-8"); 进行解码,这样就得到了“测试”

      PS:这种方式比较好,不依赖TOMCAT

1.POSt请求参数编码处理,如果客户端没有在Content-Type标头中设置字符编码信息,出现乱码的原因:容器使用的编码处理方式和客户端发送非ASCII字符的请求参数的编码方式不一样,比如网页编码是UTF-8,使用窗体post发送某个中文字符,浏览器会把这个中文方式变为在"UTF-8"编码下的三个字节的对应十六进制数值表示.(GET是HTTP服务器处理,而POST是WEB容器处理(本例使用的是tomcat9).)
在Servlet中取得请求参数时,容器若默认使用ISO-8859-1来处理编码(Tomcat 8以后URIEncoding的默认值为UTF-8,8以前为ISO-8859-1,web容器默认的URIEncoding编码方式只影响GET请求方式,Post默认的还是ISO-8859-1,仍需设置才能解决)
web容器就会把这个中文字符UTF-8编码的十六进制数值表示按照ISO-8859-1编码方式处理,最终得到的就是乱码了.
 
GET请求参数编码处理:
request.setCharacterEncoding("UTF-8");这个方法对于请求Body中的字符编码才有作用,也就是基本只对POST产生作用,终究的原因是(GET是HTTP服务器处理,而POST是WEB容器处理(本例使用的是tomcat).)
详细解说:
https://blog.csdn.net/LPLIFE/article/details/79593316
 

3.3. setCharacterEncoding()

    该函数用来设置http请求或者相应的编码。

对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。

    对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。

https://www.cnblogs.com/friends-wf/p/3731058.html

猜你喜欢

转载自www.cnblogs.com/zf201149/p/9229052.html