zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#操作OFFICE一(EXCEL)
    json的使用二(转)
    xpath简介(转载)
    使用LogParser分析IIS网站日志
    WCF Data Contract KnownTypeAttribute转载
    ExtJs中同一个URL构造多个Ext.data.JsonStore 转载
    转载Ext.form.formPanel 与服务器交互 初始化表单
    oracle表数据误删恢复
    JavaScript基础之Array函数
    Json格式类的转换相关代码转载
  • 原文地址:https://www.cnblogs.com/chendeming/p/9247665.html
Copyright © 2011-2022 走看看