请求中乱码一般分为request和response,现在按照网上的资料结合自己的理解进行总结(基于spring+tomcat)
浏览器编码格式可以参考这篇文章,戳这里
- POST
1.手动添加
在需要设置编码的地方手动添加:
request.setCharacterEncoding("UTF-8")
2.在配置文件中添加(调用spring提供的CharacterEncodingFilter)
<filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>过滤器源码如下:
protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) { request.setCharacterEncoding(this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); }通过源码我们可以知道参数 forceEncoding设置为true表示:
request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
- GET
造成乱码的原因:在GET请求中对于url中的中文参数,浏览器(IE除外)会自动对中文进行urlencode转换成16进制编码,而服务器(tomcat)会默认用ISO-8859-1进行解码,这时候浏览器的格式是UTF-8,而服务器的格式却是ISO-8859-1,字符集不同,因此造成了乱码。
1.通过对服务器(tomcat)的配置文件进行修改
由于GET请求不允许我们通过编写代码的方式来设置解码方式,可以通过修改服务器(tomcat)中的配置文件来改变服务器默认的编码格式,具体操作如下:
找到conf下的server.xml文件下的 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 在该标签中增加URIEncoding="UTF-8"(这是把默认的ISO-8859-1改成了UTF-8)
2.对数据进行反编码
第一个方法有一个很明显的缺点就是只能在自己的服务器上生效,如果项目移交给别人或者在其他环境部署的时候也要修改配置文件,这就让人很不爽了而且容易出现纰漏。
所以我们可以通过反编码的方式,把乱码的数据用ISO-8859-1重新编码后再用UTF-8进行解码,操作如下:
扫描二维码关注公众号,回复:
1576854 查看本文章
String msg = request.getParameter("msg"); msg = new String(msg.getBytes("ISO-8859-1"),"UTF-8");