解决springmvc项目中使用过滤器来解决请求方式为post时出现乱码的问题

springmvc项目中使用过滤器来解决请求方式为post时出现乱码的问题,

在spring项目中,当请求方式为post时,可能在获取数据之后会有乱码的情况,其中一种解决方法就是在拿到请求参数之前设置编码格式为utf-8,如下

 request.setCharacterEncoding("utf-8");
 String strId = request.getParameter("id");
 String strName = request.getParameter("name");
 String strSex = request.getParameter("sex");

但是当有多个处理器方法的时候每个方法中都要设置编码格式就显得过于繁琐,所以推荐第二种解决方案:使用过滤器只要在web.xml中对过滤器进行声明注册就可以了

    <!--注册声明过滤器-->
    <filter>
        <filter-name>encodingFilter</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>
        <!--强制请求对象的编码格式 使用字符集encoding-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制响应对象使用encoding的字符集编码-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--Session-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>

CharacterEncodingFilter 中有三个初始化参数:encoding、forceRequestEncoding、forceResponseEncoding。

encoding: 只有在 isForceRequestEncoding = false 并且 request 中没有设置编码的时候才会将 request 中的编码设置为 encoidng 中指定的编码格式。

forceRequestEncoding:强制设置 request 的编码格式。forceRequestEncoding = true 的时候会强制的将 request 中的编码设置为 encoding 中指定的编码格式,如果 request 中已经指定了编码格式,将会强行设置为 encoding 中的编码格式。

forceResponseEncoding:强制设置 response 的编码格式。forceResponseEncoding = true 的时候会强制的将 response 中的编码格式设置为 encoding 中指定的编码格式。

另外,我们可以看一下CharacterEncodingFilter的实现方法的实现就知道为什么要设置后边的encoding,forceRequestEncoding,forceResponseEncoding这三个参数了,因为这三个参数是这个方法中的是三个私有属性

    public class CharacterEncodingFilter extends OncePerRequestFilter {
        @Nullable
        private String encoding;
        private boolean forceRequestEncoding;
        private boolean forceResponseEncoding;

        public CharacterEncodingFilter() {
            this.forceRequestEncoding = false;
            this.forceResponseEncoding = false;
        }

        public CharacterEncodingFilter(String encoding) {
            this(encoding, false);
        }

        public CharacterEncodingFilter(String encoding, boolean forceEncoding) {
            this(encoding, forceEncoding, forceEncoding);
        }

        public CharacterEncodingFilter(String encoding, boolean forceRequestEncoding, boolean forceResponseEncoding) {
            this.forceRequestEncoding = false;
            this.forceResponseEncoding = false;
            Assert.hasLength(encoding, "Encoding must not be empty");
            this.encoding = encoding;
            this.forceRequestEncoding = forceRequestEncoding;
            this.forceResponseEncoding = forceResponseEncoding;
        }
    
Logo

欢迎加入西安开发者社区!我们致力于为西安地区的开发者提供学习、合作和成长的机会。参与我们的活动,与专家分享最新技术趋势,解决挑战,探索创新。加入我们,共同打造技术社区!

更多推荐