在使用springmvc搭建框架时,遇上过一些关于字符编码的问题,在此总结一下。
(1)ajax传入参数乱码
(2)ajax返回参数乱码
(3)tomcat升级后中文报错The valid characters are defined in RFC 7230 and RFC 3986
springmvc通过org.springframework.web.servlet.DispatcherServlet以及通配符/的方式接管了传统web应用在url发布方面的功能,成功用配置注解的方式替代了strust中复杂的xml配置。
在使用springmvc架站时,需要针对消息处理器配置字符编码,即是
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 配置request编码start --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!-- 配置request编码end --> <!-- 配置response编码start --> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> <!-- 配置response编码end --> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
但是即使是这样,还是会有乱码的情况出现。原因可能是
一、springmvc内部处理出了问题(springmvc的http消息处理默认是用ISO-8859-1编码处理的)。
原因可以看org.springframework.http.converter.StringHttpMessageConverter的源代码中默认编码配置获得
可以通过如下方式解决:
(1)spring 3.1以上,使用配置指定
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/> </bean> </mvc:message-converters> </mvc:annotation-driven>
(2)在springmvc注解上指定
@RequestMapping(value = “/test”,produces=”text/html;charset=UTF-8;”)
(3)强制不使用springmvc的返回封装,强制自定义流返回
//去掉注解@ResponseBody
@RequestMapping("/ajax") public void ajaxCharacter(HttpServletResponse response) throws IOException{ PrintWriter out = response.getWriter(); out.print("测试"); out.close(); }
二、传入时中文未经编码,浏览器将字符转为ISO-8859-1时乱码
(1)强制统一前后端编码方式
前端在JavaScript 中URL 的编码和解码函数escape(str)和unescape(str) ;对参数进行编码解码
后段使用java.NET.URLEncoder.encode(String s)和java.Net.URLDecoder.decode(String s);还原
(2)指定使用application/json方式传输
三、tomcat配置导致的编码问题
(1)tomcat7和少部分tomcat8仍未严格限定url传递字符不能包含特殊字符的,可以使用如下方式处理:
配置tomcat的config/server.xml,增加URIEncoding="UTF-8"配置
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
(2)tomcat具有严格字符限制的版本
只能参照如上第二大点进行处理
更多学习:
http参数中特殊字符处理:https://blog.csdn.net/baidu_18607183/article/details/53409186