Servlet中的过滤器工作原理

原创 2018年04月16日 15:36:47
一、Filter简介


  Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。


  
二、Filter是如何实现拦截的?


  Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:


调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。
  web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。


三、Filter开发入门


3.1、Filter开发步骤


  Filter开发分为二个步骤:


编写java类实现Filter接口,并实现其doFilter方法。
在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。
  过滤器范例:




  1.  package com.DVD.Filter;


  2. import java.io.IOException;


  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;


  11. import com.DVD.enti.User;


  12. public class checkSessionFilter implements Filter {


  13. public void destroy() {
  14. // TODO Auto-generated method stub


  15. }


  16. public void doFilter(ServletRequest request, ServletResponse response,
  17. FilterChain chain) throws IOException, ServletException {
  18. // TODO Auto-generated method stub
  19. HttpServletRequest hrsq=(HttpServletRequest)request;
  20. HttpServletResponse  hsrs=(HttpServletResponse) response;
  21. User user=(User)hrsq.getSession().getAttribute("LOGINED_USER");
  22.     if(user==null){
  23.     hrsq.getRequestDispatcher("/admin/Login.jsp").forward(hrsq, hsrs);
  24.     }
  25.     chain.doFilter(request, response);


  26. }


  27. public void init(FilterConfig arg0) throws ServletException {
  28. // TODO Auto-generated method stub
  29. System.out.println("请您登陆");


  30. }


  31. }


  
在web. xml中配置过滤器:


  1.  <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" 
  3. xmlns="http://java.sun.com/xml/ns/javaee" 
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7.     <display-name></display-name>    
  8.     <welcome-file-list>
  9.       <welcome-file>index.jsp</welcome-file>
  10.   </welcome-file-list>
  11.    <!--配置过滤器-->
  12.  <filter>
  13.   <filter-name>checkSessionFilter</filter-name>
  14.   <filter-class>com.DVD.Filter.checkSessionFilter</filter-class>
  15.   </filter>
  16.    
  17.    <!--映射过滤器-->
  18. <filter-mapping>
  19.    <filter-name>checkSessionFilter</filter-name>
  20. <!--“/*”表示拦截所有的请求 -->
  21.    <url-pattern>/admin/*</url-pattern>
  22.   </filter-mapping>
  23.  </web-app>


3.2、Filter链


  在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
  web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。


四、Filter的生命周期


4.1、Filter的创建


  Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。


4.2、Filter的销毁


  Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。


4.3、FilterConfig接口


  用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
  String getFilterName():得到filter的名称。
  String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
  Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
  public ServletContext getServletContext():返回Servlet上下文对象的引用。

Servlet中的过滤器(Filter)工作原理

一、Filter简介   Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servle...
  • pangqiandou
  • pangqiandou
  • 2016-10-29 12:55:37
  • 4615

JavaWeb——过滤器的原理

在写一个JavaWeb的网站的时候遇到了这样一个问题。我将WebRoot下面的一个user文件夹设置成必须登录才可以访问,所以就使用了过滤器 public void doFilter(Servl...
  • fonxian
  • fonxian
  • 2015-06-11 11:12:58
  • 1746

Filter过滤器的生命周期和工作原理

一、Filter是什么? Filter:过滤器,它需要实现javax.servlet.Filter接口。Filter是过滤器,与拦截器不同。过滤器是先于与之相关的Servlet和JSP运行在服务器上...
  • hanziang1996
  • hanziang1996
  • 2018-01-04 09:27:25
  • 177

Filter过滤器的作用和工作原理

对于一个web应用程序来说,过滤器是处于web容器内的一个组件,它会过滤特定请求资源请求信息和响应信息。一个请求来到时,web容器会判断是否有过滤器与该信息资源相关联,如果有则交给过滤器处理,然后再交...
  • wml_wu
  • wml_wu
  • 2014-04-22 10:14:25
  • 5508

tomcat、struts2、servlet Filter(过滤器) 工作原理

  • 2012年03月23日 17:31
  • 113KB
  • 下载

Servlet中过滤器技术

Servlet中过滤器技术Servlet中过滤器技术 基本概念 过滤器入门案例 API详解 指定拦截 对请求进行拦截 拦截指定的类型基本概念3W1H原则:why(为什么会有这个技术)、what(该技术...
  • jpzhu16
  • jpzhu16
  • 2016-09-14 18:58:43
  • 1471

Servlet中过滤器总结

过滤器要点: filter是在servlet/JSP执行前后都会执行,chain.doFilter(request,   response)之前的代码在servlet/JSP之前执行,chain...
  • pangqiandou
  • pangqiandou
  • 2016-11-29 01:21:13
  • 510

servlet过滤器、监听器、struts2拦截器的区别

1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web....
  • xyw591238
  • xyw591238
  • 2016-07-18 16:59:42
  • 1484

servlet 过滤器的使用

很多朋友在学习Javaweb时可能会对filter(过滤器)的用法产生疑问,本文将为大家介绍javaweb的filter用法 在此之前,各位新朋友可以参见我介绍servlet的文章。 正文: ...
  • ClarenceSam
  • ClarenceSam
  • 2016-12-16 21:01:09
  • 570

常用Servlet过滤器

过滤器应用案例一:解决POST请求参数中文和输出中文的乱码过滤器过滤器代码package com.study.java.filter;import java.io.IOException;import...
  • u010445297
  • u010445297
  • 2017-03-12 11:04:05
  • 997
收藏助手
不良信息举报
您举报文章:Servlet中的过滤器工作原理
举报原因:
原因补充:

(最多只允许输入30个字)