zoukankan      html  css  js  c++  java
  • CharacterEncodingFilter-Spring字符编码过滤器

    CharacterEncodingFilter主要用于处理请求中的乱码问题。

    这个类的继承关系如下:

    CharacterEncodingFilter的源码:

    /*
     * Copyright 2002-2015 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package org.springframework.web.filter;
    
    import java.io.IOException;
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet Filter that allows one to specify a character encoding for requests.
     * This is useful because current browsers typically do not set a character
     * encoding even if specified in the HTML page or form.
     *
     * <p>This filter can either apply its encoding if the request does not already
     * specify an encoding, or enforce this filter's encoding in any case
     * ("forceEncoding"="true"). In the latter case, the encoding will also be
     * applied as default response encoding (although this will usually be overridden
     * by a full content type set in the view).
     *
     * @author Juergen Hoeller
     * @since 15.03.2004
     * @see #setEncoding
     * @see #setForceEncoding
     * @see javax.servlet.http.HttpServletRequest#setCharacterEncoding
     * @see javax.servlet.http.HttpServletResponse#setCharacterEncoding
     */
    public class CharacterEncodingFilter extends OncePerRequestFilter {
    
        private String encoding;
    
        private boolean forceEncoding = false;
    
    
        /**
         * Set the encoding to use for requests. This encoding will be passed into a
         * {@link javax.servlet.http.HttpServletRequest#setCharacterEncoding} call.
         * <p>Whether this encoding will override existing request encodings
         * (and whether it will be applied as default response encoding as well)
         * depends on the {@link #setForceEncoding "forceEncoding"} flag.
         */
        public void setEncoding(String encoding) {
            this.encoding = encoding;
        }
    
        /**
         * Set whether the configured {@link #setEncoding encoding} of this filter
         * is supposed to override existing request and response encodings.
         * <p>Default is "false", i.e. do not modify the encoding if
         * {@link javax.servlet.http.HttpServletRequest#getCharacterEncoding()}
         * returns a non-null value. Switch this to "true" to enforce the specified
         * encoding in any case, applying it as default response encoding as well.
         */
        public void setForceEncoding(boolean forceEncoding) {
            this.forceEncoding = forceEncoding;
        }
    
    
        @Override
        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);
        }
    
    }

    这个类的功能在源码的注释中已经解释的非常清楚了,好好读一读!

    通过源码我们可以看到在web.xml中配置CharacterEncodingFilter时可以配置两个参数:encoding和forceEncoding.

    encoding表示使用的编码格式,一般肯定是使用UTF-8啦!

    forceEncoding表示是否允许上面设置的encoding覆盖request和response中已经存在的编码方式。

    使用方法:

    <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>

     

  • 相关阅读:
    架构,改善程序复用性的设计(目录)
    如何让你的系统配置文件更合理
    MVC验证(自动在基类中验证实体的数据有效性),本人最满意的作品之一
    MVC验证(只验证指定字段)
    Redis学习笔记~实现消息队列比MSMQ更方便
    FRG图像文件格式(四):编码技术
    缓冲区
    Oracle体系结构及备份(十一)——bcakgroundprocess
    Excel编程(2)自动填充
    设计模式:策略模式
  • 原文地址:https://www.cnblogs.com/winner-0715/p/6349852.html
Copyright © 2011-2022 走看看