web.xml中配置CharacterEncodingFilter编码过滤器的原理

1、在web.xml文件中,我们经常可以看到配置的统一编码过滤器,他继承了OncePerRequestFilter,而OncePerRequestFilter继承自GenericFilterBean,GenericFilterBean实现了filter。

因此可见CharacterEncodingFilter具有filter的所有特性;即实现拦截请求的功能:

  • 在 HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
  • 在 HttpServletResponse到达 客户端 之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

2、在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。

web服务器 根据 Filter 在 web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。

在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。

   <!-- 过滤器编码设置 -->
    <!-- 在Spring框架中是如何解决从页面传来的字符串的编码问题的呢?-->
    <filter>
        <!-- Spring框架 给我们提供的过滤器 CharacterEncodingFilter,这个过滤器就是针对于每次浏览器请求进行过滤的,然后再其之上添加了父类没有的功能即处理字符编码 -->
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!-- encoding用来设置编码格式 -->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <!-- forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,设置为true则强制覆盖之前的编码格式 -->
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <!-- 过滤器映射 -->
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <!-- url-pattern配置为 /* 表示拦截客户端浏览器所有的请求 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

其中在web容器启动的时候会调用CharacterEncodingFilter来实现将init-param中配置的参数记载进来;下面是tomcat启动过程中set值的过程(debug模式);

可见配置的utf-8编码集已经加载进来。

tomcat启动后,浏览器每次发出请求 ,都会经过我们配置的编码过滤器,最后调用doFilterInternal()方法执行过滤任务;

另外:Filter生命周期

和Servlet一样Filter的创建和销毁也是由WEB服务器负责。

不过与Servlet区别的是,它是在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。

容器创建好Filter对象实例后,调用init()方法。

接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。

当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

注意:init方法与destroy方法只会执行一次。

 

 

 

 

 

 

 


 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值