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基础之静态变量

      public class StaticVariable { public static void main(String[] args) { Person p1 = new Person(); Per ...

    2. linux杂记(⑨)vi使用说明

      基本上vi共分为三种模式,分别是[一般模式]].[编辑模式]与[指令列命令模式].这三种模式的作用是: 一般模式:以vi处理一个档案的时候,一进来该档案就是一般模式.在这个模式中,你可以使用[上下左右 ...

    3. JSON.parse这个是啥?

      var jsontext = '{"firstname":"Jesper","surname":"Aaberg",&qu ...

    4. hdu 2824The Euler function

      题目链接 快速求出a到b之间所有数的欧拉函数. 一个一个求肯定是不行的, 我们知道欧拉函数的公式为phi(n) = n*(1-1/i1)*(1-1/i2).......i1, i2为素因子. 那么我们 ...

    5. 数组序列的capacity及size函数

      #include<iostream>#include<vector>using namespace std;int main(){    vector<int> i ...

    6. OSG消锯齿

      osg::DisplaySettings::instance()->setNumMultiSamples();   在osg+mfc下成功实现抗锯齿,在程序初始化的时候,即在osg控制类中,我的 ...

    7. JConsole是什么

      从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JConsole(或者,它更高端的 “ ...

    8. 《转》java动态代理(JDK和cglib)

      该文章转自:http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的 ...

    9. 窗口嵌入到另一个窗口(VC和QT都有)

      1.用vc新建一个dialog1工程.属性默认. 2.insert一个dialog2,改为child. 3.在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2: Cdial ...

    10. HDU 5019 Revenge of GCD

      题解:筛出约数,然后计算即可. #include <cstdio> #include <algorithm> typedef long long LL; LL a1[10000 ...