springmvc之ajax乱码

在使用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

猜你喜欢

转载自www.cnblogs.com/chendeming/p/9247665.html