zoukankan      html  css  js  c++  java
  • JavaWeb中filter的详解及应用案例

    一:Filter介绍

      Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

    二:Filter的几个用处

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

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

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

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

    三:Filter的种类

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

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

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

      Filter可拦截多个请求或响应;一个请求或响应也可被多个请求拦截。

    四:Filter的应用实例

      创建一个Filter只需要两个步骤:1.创建Filter处理类(如:MyFiletr)实现javax.servlet.Filter接口;2.web.xml中配置Filter

      4.1.简单的记录日志的Filter,这个Filter负责拦截所符合条件的用户请求,并将请求的信息记录在日志中。

      

      

      web.xml配置信息:

      

      总结:上面的程序实现了doFilter()方法,实现该方法就可以实现对用户请求进行预处理,也可以实现对服务器响应进行后处理--他们的分界线为是否调用了chain.doFilter(),执行该方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。

      在上面的请求Filter中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter (request,reponse)方法,当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不够,直接调用重定向即可,无须调用chain.doFilter(request,reponse)方法。

      4.2.简单的认证登录Filter。

      

      

      web.xml配置信息:

      

      4.3.再次阐述Filter及一个应用小例子。

      Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

      Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个Java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获处理。

      

      web.xml配置信息:

      

    五:应用总结  

      Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

      Filter的生命周期和Servlet一样,Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。注意:init方法与destroy方法只会直接一次。
      Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。

  • 相关阅读:
    数组中出现次数超过一半的数字
    字符串的排列(important)
    #pragma mark指令的作用
    类的声明和实现
    OC比C中,新增的数据类型
    NSLog (Log信息的输出)
    C语言中文件相关操作
    static 及 extern
    C语言预处理命令
    结构体
  • 原文地址:https://www.cnblogs.com/vanl/p/5742501.html
Copyright © 2011-2022 走看看