http://www.cnblogs.com/jbelial/archive/2012/07/09/2582638.html

Filter 介绍:

  它主要用于对用户请求进行预处理,也可以对HttpServletResponse 进行后处理。使用Filter 的完整流程:Filter 对用户请求进行预处理,接着将请求交给Servlet 进行处理并生成响应,最后Filter 再对服务器响应进行后处理。

  Filter 用处:

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

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

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

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

  

  Filter 种类:

  > 用户授权的 Filter

  > 日志 Filter

  > 负责解码的 Filter

  > Filter 可负责拦截多个请求或响应

创建一个Filter:

  1、创建Filter类

  必须实现javax.servlet.Filter接口,在该接口中定义了如下方法:

  1、void init(FilerConfig config):用于完成Filter的初始化。

  2、void destroy():用于Filter撤销前,完成某些资源的回收。

  3、void doFilter(ServletRequest request,ServletResponse response, FilterChain chain):实现过滤功能,该方法就是对每一个请求及功能增加的额外处理。

  

  1. package jbelial.Filter;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.Filter;
  6. import javax.servlet.FilterChain;
  7. import javax.servlet.FilterConfig;
  8. import javax.servlet.ServletContext;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.ServletRequest;
  11. import javax.servlet.ServletResponse;
  12. import javax.servlet.http.HttpServletRequest;
  13.  
  14. public class LogFilter implements Filter {
  15.  
  16. //FilterConfig用于访问Filter的配置信息
  17. private FilterConfig config ;
  18. // 实现销毁
  19. public void destroy() {
  20. // TODO Auto-generated method stub
  21. this.config = null ;
  22. }
  23.  
  24. public void doFilter(ServletRequest request, ServletResponse response,
  25. FilterChain chain) throws IOException, ServletException {
  26. // TODO Auto-generated method stub
  27. //-----------------对用户请求执行预处理-----------------------
  28. ServletContext context = this.config.getServletContext() ;
  29. long before = System.currentTimeMillis() ;
  30. System.out.println("开始过滤。。。。");
  31. //将请求转换成HttpServletRequest 请求。
  32. HttpServletRequest hrequest = (HttpServletRequest)request ;
  33. System.out.println("Filter 已经截获到用户的请求的地址:" +
  34. hrequest.getServletPath());
  35. // Filter 只是链式处理,请求依然放行到目的地址
  36. chain.doFilter(request, response) ;
  37. //---------------对服务器响应执行后处理-----------------------
  38. long after = System.currentTimeMillis() ;
  39. System.out.println("过滤结束。。。。");
  40. System.out.println("请求被定位到"+hrequest.getRequestURI()+
  41. " 所花时间:"+(after - before));
  42.  
  43. }
  44. // 实现初始化
  45. public void init(FilterConfig config) throws ServletException {
  46. // TODO Auto-generated method stub
  47. this.config = config ;
  48. }
  49.  
  50. }

  实现该方法就可以实现对用户的请求进行预处理,也可以对服务器响应进行后处理——分界线为是否调用了chain.doFilter(request.response) 。

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

  2、配置Filter

   > 配置 Filter 名。

   > 配置 Filter 拦截 URL 模式。

     1、通过Annotation 进行配置

      在Filter 类 中添加:

      @WebFilter(filterName= "log",urlPatterns = {"/*"})

      下面附上@WebFilter 支持的常用属性表

属性 是否必须 说明
asyncSupported F 指定该Filter是否支持异步操作模式。
dispatcherTypes F

指定该Filter仅对dispatchar模式的请求进行过滤。该属性支持ASYNC、ERROR、FORWARD、

INCLUDE、REQUST这5个值的任意组合。默认为同时过滤5种模式的请求。

displayName  F 指定该Filter的显示名  
filterName      指定该Filter的名字
initParams F 用于为该Filter配置参数
servletNames F 该属性值可指定多个Servlet的名称,用于指定该Filter仅对这几个Servlet执行过滤
urlPatterns F 指定该Filter所拦截的URL

     2、在web.xml 文件中配置:

  1. <filter>
  2. <filter-name>log</filter-name>
  3. <filter-class>jbelial.Filter.LogFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>log</filter-name>
  7. <url-pattern>/*</url-pattern>
  8. </filter-mapping>

  

   Filter 的 doFilter()方法里面多了一个FilterChain 的参数,通过该参数可以控制是否放行用户请求。在实际项目中, Filter 里 doFilter() 方法里的代码就是从多个Servlet 的service() 方法里面抽取的通用代码,通过使用Filter 可以实现更好的代码复用。

   如下面的代码:

  1. @WebFilter(filterName="authority"
  2. , urlPatterns={"/*"}
  3. , initParams={
  4. @WebInitParam(name="encoding", value="GBK"),
  5. @WebInitParam(name="loginPage", value="/login.jsp"),
  6. @WebInitParam(name="proLogin", value="/proLogin.jsp")})
  7. public class AuthorityFilter implements Filter
  8. {
  9. //FilterConfig可用于访问Filter的配置信息
  10. private FilterConfig config;
  11. //实现初始化方法
  12. public void init(FilterConfig config)
  13. {
  14. this.config = config;
  15. }
  16. //实现销毁方法
  17. public void destroy()
  18. {
  19. this.config = null;
  20. }
  21. //执行过滤的核心方法
  22. public void doFilter(ServletRequest request,
  23. ServletResponse response, FilterChain chain)
  24. throws IOException,ServletException
  25. {
  26. //获取该Filter的配置参数
  27. String encoding = config.getInitParameter("encoding");
  28. String loginPage = config.getInitParameter("loginPage");
  29. String proLogin = config.getInitParameter("proLogin");
  30. //设置request编码用的字符集
  31. request.setCharacterEncoding(encoding);
  32. HttpServletRequest requ = (HttpServletRequest)request;
  33. HttpSession session = requ.getSession(true);
  34. //获取客户请求的页面
  35. String requestPath = requ.getServletPath();
  36. //如果session范围的user为null,即表明没有登录
  37. //且用户请求的既不是登录页面,也不是处理登录的页面
  38. if( session.getAttribute("user") == null
  39. && !requestPath.endsWith(loginPage)
  40. && !requestPath.endsWith(proLogin))
  41. {
  42. //forward到登录页面
  43. request.setAttribute("tip" , "您还没有登录");
  44. request.getRequestDispatcher(loginPage)
  45. .forward(request, response);
  46. }
  47. //"放行"请求
  48. else
  49. {
  50. chain.doFilter(request, response);
  51. }
  52. }
  53. }

  如果用户没有登录,那么只能访问/login.jsp和/proLogin.jsp页面。  

  在 web.xml文件中配置该Filter:

  1. <filter>
  2. <filter-name>authority</filter-name>
  3. <filter-class>jbelial.Filter.Authority</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>GBK</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>loginPage</param-name>
  10. <param-value>/login.jsp</param-value>
  11. </init-param>
  12. <init-param>
  13. <param-name>proLogin</param-name>
  14. <param-value>/proLogin.jsp</param-value>
  15. </init-param>
  16. </filter>
  17. <filter-mapping>
  18. <filter-name>authority</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21. </web-app>

学习Filter的更多相关文章

  1. Java web学习filter (1)

    一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...

  2. Python学习——filter&map

    filter&map 1.filter函数 filter()函数用于过滤序列,过滤掉不符合条件的元素,Python3以后返回一个迭代器对象(可以用list()转化为列表查看). filter( ...

  3. (四) ffmpeg filter学习-filter命令学习

    http://blog.csdn.net/joee33/article/details/51946712 http://blog.csdn.net/tkp2014/article/details/53 ...

  4. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  5. Filter、Listener 学习总结

    今天我们来介绍 Filter.Listener 这两个模块一些简单的知识和应用,接下来我们开始我们的正题 ! 1. Filter(过滤器) 1.1 对 Servlet 容器调用 Servlet 的过程 ...

  6. [转]Servlet的学习之Filter过滤器技术

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  7. JavaWeb——Filter

    一.基本概念 之前我们用一篇博文介绍了Servlet相关的知识,有了那篇博文的知识积淀,今天我们学习Filter将会非常轻松,因为Filter有很多地方和Servlet类似,下面在讲Filter的时候 ...

  8. 编译direct show 的filter项目

    最近搞windows编程,想学习一下direct show.编译了一下sdk里面的一个sample filter,做个笔记,记录一下. 说来渐愧,vc也用了n久了,还没有自己动手建立一个正式的项目,都 ...

  9. filter与servlet对照

    最近在开java物自,还记得刚开始使用servlet这是一个调试ajax什么时候,然后,我不知道怎么用,你知道写的路径来调用,总是提示404错,,到最后自己一点点的调通了,知道servlet是须要se ...

随机推荐

  1. 倍福TwinCAT(贝福Beckhoff)基础教程4.2 TwinCAT如何读写CSV文件

    本程序只是在官方范例程序上稍作修改,在官方原有的范例中,演示了多种模式的读写(可以认为CSV文件是比TXT文件需要更多数据量的时候使用,比如记录一个小型的数据库集合)   但是写的比较混乱,甚至没有H ...

  2. javascript 设计模式 -- 发布/订阅模式

    直接上代码: index.html : <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  3. _.pick lodash

    http://lodash.think2011.net/pick _.pick(object, [props]) 创建一个从 object 中选中的属性的对象. 参数 object (Object) ...

  4. 【DB2】db2命令Export与Import

    环境准备 1.新建表 qinys@Linux:~> db2 "create table tb1(id int,dt timestamp,name varchar(100))" ...

  5. 代理工具Charles使用

    代理工具Charles使用 分类: MAC 2014-03-27 20:41 7810人阅读 评论(2) 收藏 举报 手机开发 一.跟踪HTTPS 1.下载官方的证书ssl.zip证书,解压成*.cr ...

  6. asp.net中UpdatePanel数据加载成功后回调

    //添加UpdatePanel加载成功后执行的js方法 Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(onPageLoade ...

  7. 数据文件offline 时oracle 干了那些事?

    SQL> oradebug setmypid Statement processed. SQL> oradebug unlimit Statement processed. SQL> ...

  8. CoreImage的模糊滤镜

    //1.原始图片 UIImage * image = [UIImage imageNamed:@"1.jpg"]; /****************core image***** ...

  9. Android下 布局加边框 指定背景色 半透明

    背景设置为自定义的shape文件: <!-- <?xml version="1.0" encoding="utf-8"?><shape ...

  10. Python Numpy 数组的初始化和基本操作

    一.基础: Numpy的主要数据类型是ndarray,即多维数组.它有以下几个属性: ndarray.ndim:数组的维数 ndarray.shape:数组每一维的大小 ndarray.size:数组 ...