zoukankan      html  css  js  c++  java
  • SpringMVC 过滤器

    参考:

      http://qq-22530757.iteye.com/blog/2177513

      http://www.jdon.com/dl/best/spring-security.html

      https://blog.csdn.net/MissEel/article/details/79351231

      https://www.cnblogs.com/edwardlauxh/archive/2010/03/11/1918618.html

    一. 概述

      Spring MVC中的过滤器有两种(我自己理解的),一种称为普通过滤器。另一种称为安全过滤器。这里只讨论普通过滤器,其中普通过滤器又分为两种:① SpringMVC框架自带的过滤器;② 开发人员自定义的过滤器。下面分别进行讲解

    二.  SpringMVC框架自带的过滤器

     1. 概述

      在spring-web.jar包中提供有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter接口

      不过,这些SpringMVC框架自带的过滤器实现的方式主要分为以下几类:

       (1) 直接实现Filter,这一类过滤器只有CompositeFilter;

            (2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;

            (3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;

            (4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。

    2. 过滤器放在容器结构的什么位置?

      过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。

      Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

    3. Filter 有如下几个种类:

      l  用户授权的Filter: Filter 负责检查用户请求,根据请求过滤用户非法请求。 

      l  日志Filter: 详细记录某些特殊的用户请求。 

      l  负责解码的Filter: 包括对非标准编码的请求解码。 

      l  能改变XML 内容的XSLTFilter 等。

    4. Filter 有如下几个用处

      l  在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。 

      l  根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。 

      l  在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。 

      l  根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

    5. 创建一个Filter 只需两个步骤

      说明:SpringMVC框架自带的过滤器也需要实现以下两个步骤,只不过第一步已经完成,不用我们自己写了,但是自定义过滤器的话,这两步都需要我们完成

      (1)创建Filter 处理类(必须实现javax.servlet.Filter 接口)

      (2)在web.xml 文件中配置Filter 

    6. javax.servlet.Filter 接口

      创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。

      • void init(FilterConfig config): 用于完成Filter 的初始化。 
      • void destroy(): 用于Filter 销毁前,完成某些资源的回收。 
      • void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。

      过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。

    7. 以SpringMVC框架自带的编码处理过滤器为例来学习过滤器springmvc项目中的使用

      (1)创建Filter 处理类(必须实现javax.servlet.Filter 接口)

         这一步SpringMVC已经完成,不需要我们自己写了

      (2)在配置文件中进行配置,配置文件为dispatcher-servlet的配置文件,我这里是dispatcher-servlet.xml,配置内容如下

    <!-- 定义Filter -->
    <filter>
        <!-- Filter的名字 -->
        <filter-name>encodingFilter</filter-name>
        
        <!-- Filter的实现类 -->
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        
        <!-- init-prama为注入的set参数 -->
        <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拦截的URL地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name>encodingFilter</filter-name>
        
        <!-- Filter负责拦截的URL 全部以/的请求,如果<url-pattern>/*.action </>,将会以拦截*.action的请求-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

     其中,每个<filter></filter>对应一个<filter-mapping></filter-mapping>,用于配置该过滤器都过滤哪些url的请求

  • 相关阅读:
    commons-lang3工具类学习(三)
    commons-lang3工具类学习(二)
    commons-lang3工具类学习(一)
    Spring之ClassPathResource加载资源文件
    Spring详解(十)加载配置文件
    java IO流总结
    Spring自定义注解配置切面实现日志记录
    使用@Cacheable 踩过的坑
    将BufferedImage转换为InputStream,亲测可用
    计算两个日期之间间隔的天数
  • 原文地址:https://www.cnblogs.com/tjudzj/p/9205431.html
Copyright © 2011-2022 走看看