`
qq_22530757
  • 浏览: 19490 次
社区版块
存档分类
最新评论

SpringMVC 过滤器Filter使用解析

阅读更多

SpringMVC框架是一个成熟的优秀java web开发框架,学习研究框架设计有助于我们更好的理解和掌握spring MVC,设计和写出更符合的结构和代码。

本节主要是研读SpringMVC框架中的过滤器设置,以编码处理过滤器为例来学习框架内是怎样设置过滤器的。

 

 

如上所示的spring-web.jar包结构所示, Spring的web包中中提供有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,

不过实现的方式有以下几类

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

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

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

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

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

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

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

Filter 有如下几个种类:

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

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

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

l  能改变XML 内容的XSLTFilter 等。 

 

Filter 有如下几个用处

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

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

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

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

 

创建一个Filter 只需两个步骤
(1)创建Filter 处理类: 

(2)在web.xml 文件中配置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元素驱动。

参照编码过滤器示例来查看怎么实现的

  1. 首先配置在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>

      <init-param>

         <param-name>forceEncoding</param-name>

         <param-value>true</param-value>

      </init-param>

    </filter>

    

    <filter-mapping>

       <filter-name>encodingFilter</filter-name>

       <url-pattern>*.do</url-pattern>

    </filter-mapping>

 
复制代码

 

其中,filter-class 为过滤器Filter类,init-prama为注入的set参数

Filter-mapping中的url-pattern为过滤的url类型

 

类的继承关系

CharacterEncodingFilter r类继承了 OncePerRequestFilter

public class CharacterEncodingFilter extends OncePerRequestFilter

 

OncePerRequestFilter 类又继承了GenericFilterBean

public abstract class OncePerRequestFilter extends GenericFilterBean

 

public abstract class GenericFilterBean implements

       Filter, BeanNameAware, EnvironmentAware, ServletContextAware, InitializingBean, DisposableBean

 

 

设置编码的核心代码为

复制代码
@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);

   }

 
复制代码

 

 

其中filterChain为过滤器链,表示执行完这个过滤器之后接着执行下一个过滤器

区别

         我们在使用过滤器时,通常没必要知道GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter,但不防碍我们了解这几个类,就上文所述,AbstractRequestLoggingFilter继承自OncePerRequestFilter,OncePerRequestFilter继承自GenericFilterBean,所以我们知道,genericFilterBean是任何类型的过滤器的一个比较方便的超类,这个类主要实现的就是从web.xml文件中取得init-param中设定的值,然后对Filter进行初始化(当然,其子类可以覆盖init方法)。

         OncePerRequestFilter继承自GenericFilterBean,那么它自然知道怎么去获取配置文件中的属性及其值,所以其重点不在于取值,而在于确保在接收到一个request后,每个filter只执行一次,它的子类只需要关注Filter的具体实现即doFilterInternal。

        AbstractRequestLoggingFilter是对OncePerRequestFilter的扩展,它除了遗传了其父类及祖先类的所有功能外,还在doFilterInternal中决定了在过滤之前和之后执行的事件,它的子类关注的是beforeRequest和afterRequest。

       总体来说,这三个类分别执行了Filter的某部分功能,当然,具体如何执行由它们的子类规定,若你需要实现自己的过滤器,也可以根据上文所述继承你所需要的类。

 

劳动所得 不喜勿喷:获取【下载地址】

2
17
分享到:
评论

相关推荐

    springmvc+mybatis面试题

    1. 入口不同:SpringMVC的入口是DispatcherServlet(前端控制器),而Struts2的入口是Filter(过滤器)。 2. 开发方式:SpringMVC基于方法开发,参数通过方法形参传递;Struts2基于类开发,参数通过类的属性传递。 3...

    Shiro+SpringMVC 示例

    - **Shiro配置**:在SpringMVC的配置文件中,我们需要定义Shiro的过滤器链,比如`authc`(身份验证过滤器)和`perms`(权限过滤器)。 - **Security Manager**:Shiro的核心组件,负责管理和协调所有安全相关组件...

    通过原理解析Spring mvc的内置编码过滤器

    答案是使用CharacterEncodingFilter过滤器,该过滤器是Spring MVC内部提供的,主要用于设置请求响应的字符编码。 CharacterEncodingFilter过滤器有两个重要的参数:encoding和forceEncoding。encoding参数用于设置...

    吴天雄--SpringMVC笔记.doc

    - 字符编码过滤器确保正确处理请求和响应的字符编码。 - 自定义类型转换器,允许自定义数据类型转换规则。 - 跳转方式:forward 和 redirect,分别对应页面内部转发和外部重定向。 - 作用域传值:session、...

    SpringMVC第三天.pdf

    2. **自定义拦截器与过滤器(Filter)的区别** - **过滤器**:是一种更底层的技术,可以拦截任何HTTP请求,无论是否是通过SpringMVC处理的请求。 - **自定义拦截器**:仅能拦截通过SpringMVC处理的请求,即那些映射...

    SpringMVC +Security+Hibernate

    SpringMVC、Security和Hibernate是Java开发中三个非常重要的框架,它们各自负责应用程序的不同层面,协同工作可以构建出高效、安全且数据管理...同时,也可以尝试自定义拦截器、过滤器和安全策略,以满足特定项目需求。

    springmvc shiro

    - 过滤器链设置:Shiro通过一系列过滤器实现安全控制,如authc(认证过滤器)、perms(权限过滤器)等。需要在web.xml中配置这些过滤器,并将它们指向Spring管理的Bean。 - Controller层集成:在Controller方法上...

    SpringMVC面试专题1

    - 入口不同:SpringMVC由Servlet(前端控制器)处理,Struts2由Filter(过滤器)处理。 - 开发方式:SpringMVC基于方法,每个URL对应一个方法;Struts2基于类,请求参数通过类的属性传递。 - 数据存取:SpringMVC...

    servlet和springmvc源码servlet和springmvc源码

    - **过滤器链的改进**:过滤器可以使用`@WebFilter`注解定义,并且支持链式调用,便于管理过滤器顺序。 接下来,我们转向SpringMVC,它是Spring框架的一个模块,用于构建高度可配置和松耦合的Web应用程序。...

    springMVC与sitemesh的结合

    这可以通过创建一个DelegatingFilterProxy bean并指向Sitemesh的过滤器实现。例如: ```xml &lt;filter&gt; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter....

    SpringMVC面试专题及答案.pdf

    1)入口点不同:SpringMVC 通过 DispatcherServlet,而 Struts2 使用 Filter 过滤器。 2)开发方式:SpringMVC 基于方法,每个 URL 映射一个方法;Struts2 基于类,一个类对应多个请求。 3)数据存取方式:SpringMVC...

    spring+springMVC+Mybatis框架整合

    - `&lt;filter&gt;`和`&lt;filter-mapping&gt;`用于设置字符编码过滤器`CharacterEncodingFilter`,确保请求和响应的字符编码为UTF-8,避免乱码问题。 - `&lt;context-param&gt;`和`&lt;listener&gt;`用于初始化Spring的全局上下文,`...

    springMVC+shiro简单demo

    5. **权限控制**:利用 Shiro 的注解或 Filter 进行 URL 访问权限控制,比如 @RequiresAuthentication 或自定义过滤器。 6. **会话管理**:可能实现了会话超时、会话同步等功能,确保用户在多设备登录时的安全。 7. ...

    分享SpringMVC归纳

    - 对于POST请求,可以通过在`web.xml`中配置字符编码过滤器来解决。 ```xml &lt;filter&gt; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/...

    springMVC快速开发手册

    - `&lt;filter&gt;`和`&lt;filter-mapping&gt;`标签定义过滤器,`CharacterEncodingFilter`确保请求和响应的编码统一为UTF-8。 - `&lt;session-config&gt;`和`&lt;servlet&gt;`、`&lt;servlet-mapping&gt;`标签可配置Session超时和...

    SpringMVC演示项目

    4. **SpringMVC 中间件**:例如拦截器(Interceptor)、过滤器(Filter),实现日志记录、权限控制等功能。 通过这个简单的 SpringMVC 项目,你可以深入理解 MVC 架构以及 SpringMVC 如何处理 HTTP 请求、如何与...

    SpringMVC 多版本接口/IP访问控制/ANT打包发布到LINUX

    2. 自定义Filter:编写一个自定义过滤器,检查每个请求的源IP,并根据预设规则决定是否允许访问。 然后,我们转向**ANT打包**。ANT是Java项目常用的构建工具,用于自动化编译、测试和部署任务。创建ANT build.xml...

    SpringMVC讲义大全.docx

    SpringMVC的拦截器(Interceptor)和过滤器(Filter)允许开发者在请求处理前或处理后执行自定义逻辑,例如实现日志记录、权限验证等功能。拦截器通过实现`HandlerInterceptor`接口并注册到Spring容器中,而过滤器则...

    我的第一个纯springmvc项目

    - **配置过滤器**:在`web.xml`中配置`DispatcherServlet`作为过滤器。这一步非常关键,因为`DispatcherServlet`负责处理所有的HTTP请求,并将它们分发到相应的控制器。 - 示例配置代码: ```xml &lt;filter&gt; ...

    SpringMVC框架

    5. **过滤器Filter** 在Web应用中,Filter用于拦截请求和响应,进行预处理或后处理。在SpringMVC中,我们可以创建自定义Filter来实现特定的功能,比如这里的记录请求详情。例如,实现一个Filter监听所有请求,记录...

Global site tag (gtag.js) - Google Analytics