Filter对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

1  生命周期:服务器启动执行init 方法,当调用拦截到的时候执行doFilter方法,服务器关闭执行destroy方法。

2  实例

1)批量设置请求编码

public class EncodingFilter implements Filter {


    private String encoding = null;

    public void destroy() {

        encoding = null;

    }

    public void doFilter(ServletRequest request, ServletResponse response,

            FilterChain chain) throws IOException, ServletException {

        String encoding = getEncoding();

        if (encoding == null){

            encoding = "gb2312";

        }

        request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码

        chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

        this.encoding = filterConfig.getInitParameter("encoding");

    }

    private String getEncoding() {

        return this.encoding;

    }

}

Xml代码

<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.logcd.filter.EncodingFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>gb2312</param-value>
    </init-param>
</filter> <filter-mapping>
   <filter-name>EncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>

</filter-mapping>

2)用filter控制用户访问权限

public void doFilter(ServletRequest request,

        ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {     HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;     HttpSession session = req.getSession();
    if (session.getAttribute("username") != null) {//登录后才能访问
        chain.doFilter(request, response);
    } else {
        res.sendRedirect("../failure.jsp");
    }

}

XML 代码

<filter>
    <filter-name>SecurityFilter</filter-name>
    <filter-class>com.logcd.filter.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SecurityFilter</filter-name>
    <url-pattern>/admin/*</url-pattern>

</filter-mapping>

3 Filter 执行顺序

当有多个Filter 的时候执行顺序是采用过滤链的方法,一次执行多个Filter的doFilter()方法.按照web.xml中过滤器定义的先后循序组装成一条链。先执行chain.doFilter()前面的方法一次然后从后到前执行chain.doFilter()后面的方法。

如上执行顺序为:

  • 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
  • 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
  • 如果用户已登录,则访问请求的资源:/admin/index.jsp。
  • 如果用户未登录,则页面重定向到:/failure.jsp。
  • 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
  • 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。
  • 参考资料:http://log-cd.iteye.com/blog/423179
  • Filter 知识总结的更多相关文章

    1. (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

      ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...

    2. JavaWeb三大组件之一Filter知识总结

      [1] Filter简介    > Filter翻译为中文是过滤器的意思.    > Filter是JavaWeb的三大web组件之一Servlet.Filter.Listener    ...

    3. Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

      前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

    4. Asp.Net MVC3 简单教程(三)详解Controller之Filter 【转】

      前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

    5. Springboot之登录模块探索(含Token,验证码,网络安全等知识)

      简介 登录模块很简单,前端发送账号密码的表单,后端接收验证后即可~ 淦!可是我想多了,于是有了以下几个问题(里面还包含网络安全问题): 1.登录时的验证码 2.自动登录的实现 3.怎么维护前后端登录状 ...

    6. ASP.NET从MVC5升级到MVC6 RC2 总目录 - 发布在RC2Release之后

      序言 随着MVC6RC2的推出,MVC6的脚步越来越近了.但是在我们的手里,有大批量的MVC5的项目.如何将MVC5升级到MVC6,将是一个很大的课题.微软官方暂时没有一个升级指导,或者一个迁移工具, ...

    7. TCPCopy 应用

      TCPCopy 使用方法 TCPCopy是一种请求复制(所有基于tcp的packets)工具,可以把在线请求导入到测试系统中去.目前此工具已经广泛应用于国内各大互联网公司. TCPCopy七大功能1) ...

    8. 经典ASP.NET MVC3.0入门详解

      http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显 ...

    9. ASP.NET从MVC5升级到MVC6

      1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6   ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter ...

    随机推荐

    1. Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)

      /*** * 懒汉模式 1 * 可以延迟加载,但线程不安全. * @author admin * */ public class TestSinleton1 { private static Test ...

    2. mysql中中文字符串的截取

      SET NAMES 'utf8'; SET v_length = character_length(citys); SET citys = left(citys COLLATE utf8_bin, v ...

    3. 一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217)

      一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217) 浏览效果: http://www.beyond630.com/jqu ...

    4. MySQL 基础学习

      http://www.w3school.com.cn/sql/ 1.limit x,y 或 limit z  :选取从x开始的y条数据  或  选取最开始的 z条数据 , 2.like '%N%' : ...

    5. php知识--递归

      <?php // /* * 遍历输出文件夹中的所有内容 * @param1 string $dir,要遍历的路径 * @param2 int $level = 0,当前的级别 */ functi ...

    6. 用WebBrowser实现HTML界面的应用和交互 good

      这一篇将继续讨论在使用delphi进行普通应用程序开发的时候,WebBrowser的具体应用,主要是针对使用其进行HTML界面开发的,这也是一篇我在网上找到的资料,大家如要转载,请尊重原作者的知识产权 ...

    7. JAVA FILE or I/O学习 - 补充CopyFiles功能

      public class CopyFiles { public static void main(String[] args) { CopyFiles copyFiles = new CopyFile ...

    8. Git安装及基本使用

      准备: Git软件,github账号. Git安装: 直接百度搜git下载,windows和mac不同平台的.官网上的下载地址很慢或者根本下不了. 默认配置安装. github: 网址:https:/ ...

    9. 浅析JQuery中的html(),text(),val()区别

      1.HTML html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档 html(val):设置每一个匹配元素的html内容.这个函数不能用于XML文档.但 ...

    10. 【c语言】推断一个数是不是2的n次方

      // 推断一个数是不是2的n次方 #include <stdio.h> void judge_n(int a) { int b = a - 1; if ((a & b) == 0) ...