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. Linux命令之修改主机名

      ubuntu永久修改主机名 1.查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后: 其二,在终端 ...

    2. python cmd命令调用

      关于python调用cmd命令: 主要介绍两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.sy ...

    3. pyVmomi入门

      简要说明 pyVmomi is the Python SDK for the VMware vSphere API that allows you to manage ESX, ESXi, and v ...

    4. 深信服模式(先做减法,必须拜访客户三次、研究需求方向,把产品的问题控制住,快速反应,在未来十年,绝大部分业务都会搬到Internet上来,实现All on Internet)good

      深圳市盛凯信息科技有限公司与深信服合作多年,可以说是看着深信服“飞速”长大的.盛凯的总经理邓渊在采访中笑言:“他们(深信服)发展得太快,而我们发展得太慢.” 深信服的产品线已从最初只有VPN一条,到目 ...

    5. 领域驱动设计系列(2)浅析VO、DTO、DO、PO的概念、区别和用处

      PO:persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录.好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:business object业 ...

    6. 《网络编程》Unix 域套接字

      概述 Unix 域套接字是一种client和server在单主机上的 IPC 方法.Unix 域套接字不运行协议处理,不须要加入或删除网络报头,无需验证和,不产生顺序号,无需发送确认报文,比因特网域套 ...

    7. ZOJ 3080 ChiBi(spfa)

      ZOJ Problem Set - 3080 ChiBi Time Limit: 5 Seconds      Memory Limit: 32768 KB watashi's mm is so pr ...

    8. .NET连接SAP系统专题:.NET调用RFC几种方式(一)

      本来今天是要写一篇关于NCO3.0的东西,就是关乎.NET调用SAP的RFC的,支持VS2010和.NET 4.0等.现在网上到处都是充斥着NCO1.X和NCO2.0,需要用VS2003来使用,都是一 ...

    9. linux定时任务crontab的设置

      linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...

    10. JavaSE_ 面向对象 总目录(7~10)

      JavaSE学习总结第07天_面向对象2 07.01 成员变量和局部变量的区别07.02 方法的形式参数是类名的调用07.03 匿名对象的概述和应用07.04 封装的概述07.05 封装的好处和设计原 ...