在看乱码问题之前不妨先看下编码的问题
一、js和java中URI的编码和解码(https://i.cnblogs.com/EditPosts.aspx?postid=9237187&update=1)
二、Tomcat在处理POST和GET提交方式时的字符编码问题(https://i.cnblogs.com/EditPosts.aspx?postid=9266982&update=1)
三、encodeURI来解决URL传递时为什么需要进行两次encodeURI编码(https://www.cnblogs.com/damoblog/articles/9272795.html),
JAVA:编码与乱码问题(https://www.cnblogs.com/damoblog/articles/9272758.html)
四、为什么会乱码
由于前台在传参数时,前端的页面的编码不确定(可能为utf-8,GBK或者其它)性,
以至于我们在后台接收参数时不知道所传参数的编码格式,从而导致后台接收参数乱码的情况。
五、怎么解决
1. ajax的POST请求方式
(1)post的请求参数在请求体中,前台(客户端)发送请求时必需要设置请求头,
ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");
(application/x-www-form-urlencoded,是常用的请求头,即form表单语法,详细可以
参考https://blog.csdn.net/x1005252070/article/details/71055279);
(2)后台接收参数时,通过request.setCharacterEncoding("UTF-8"),来设置Tomcat接收请求的编码格式,
并且一定要放在request.getParameter("XXX")。(注意:通过GET方式提交的数据,该设置无效!)
之前,否则不起作用。这里需要注意的是,使用POST提交方式时,通过设置Tomcat的server.xml文件中的编码时是没有效果的。
2. ajax的GET请求方式
(1)get的请求参数是通过URL传递的,所以上面通过request设置的编码格式是不起作用的;这里有一下几种方式去解决
第一种:可以在每次发生请求之前对URL进行编码,如encodeURI(parameter);
第二种:通过设置Tomcat的编码方式。(参照:https://blog.csdn.net/shiluyong8068/article/details/78386350)
3. 无论POST或者GET请求可以利用字符去转化处理,如:
String username = request.getParameter("username"); byte[] buf = username.getBytes("ISO8859-1"); username = new String(buf,"UTF-8");
4. 总结:
对于POST方法提交的表单,上面的方法3仍然有效,个人建议使用方法3,因为方法3的代码是利用了Java的编码能力,
对于所有的Web服务器都会有效,而setCharacterEncoding方法是通过Web服务器支持的,并不是所有的Web服务器都会对该方法有很好的支持。