Servlet过滤器的概念及结构浅析

开发 后端
Servlet过滤器的概念是什么呢?Servlet过滤器结构又怎么样呢?本文将向你介绍servlet过滤器这些基本情况。

Servlet过滤器的含义是什么呢?Servlet过滤器的结构又是什么呢?实现又是什么呢?来开始我们的讲解:

1.Servlet 过滤器是什么?

Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性,等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。

Servlet 过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说,Servlet 过滤器是:

◆声明式的 :过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。

◆动态的 :过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。

◆灵活的 :过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的 Web 组件之间调度的请求。***,可以将过滤器链接起来以提供必需的功能。

◆模块化的 :通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。

◆可移植的 :与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。

◆可重用的 :归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。

◆透明的 :在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。

2.Servlet 过滤器体系结构

正如其名称所暗示的, Servlet 过滤器用于拦截传入的请求和/或传出的响应,并监视、修改或以某种方式处理正在通过的数据流。过滤器是自包含、模块化的组件,可以将它们添加到请求/响应链中,或者在无需影响应用程序中其他 Web 组件的情况下删除它们。过滤器仅只是改动请求和响应的运行时处理,因而不应该将它们直接嵌入 Web 应用程序框架,除非是通过 Servlet API 中良好定义的标准接口来实现。

Web 资源可以配置为没有过滤器与之关联(这是默认情况)、与单个过滤器关联(这是典型情况),甚至是与一个过滤器链相关联。那么过滤器究竟做什么呢? 像 servlet 一样,它接受请求并响应对象。然后过滤器会检查请求对象,并决定将该请求转发给链中的下一个组件,或者中止该请求并直接向客户机发回一个响应。如果请求被转发了,它将被传递给链中的下一个资源(另一个过滤器、servlet 或 JSP 页面)。在这个请求设法通过过滤器链并被服务器处理之后,一个响应将以相反的顺序通过该链发送回去。这样就给每个过滤器都提供了根据需要处理响应对象的机会。

当过滤器在 Servlet 2.3 规范中***引入时,它们只能过滤 Web 客户机和客户机所访问的指定 Web 资源之间的内容。如果该资源然后将请求调度给其他 Web 资源,那就不能向幕后委托的任何请求应用过滤器。2.4 规范消除了这个限制。Servlet 过滤器现在可以应用于 J2EE Web 环境中存在请求和响应对象的任何地方。因此,Servlet 过滤器可以应用在客户机和 servlet 之间、servlet 和 servlet 或 JSP 页面之间,以及所包括的每个 JSP 页面之间。这才是我所称的强大能力和灵活性!

3.编写Servlet过滤器实现类的程序

过滤器 API 包含 3 个简单的接口,它们整洁地嵌套在 javax.servlet 包中。那 3 个接口分别是 Filter 、 FilterChain 和 FilterConfig 。从编程的角度看,过滤器类将实现 Filter 接口,然后使用这个过滤器类中的 FilterChain 和 FilterConfig 接口。该过滤器类的一个引用将传递给 FilterChain 对象,以允许过滤器把控制权传递给链中的下一个资源。 FilterConfig 对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。

为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现 Filter 接口:

init() :这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。该方法接受一个 FilterConfig 类型的对象作为输入。

doFilter() :与 servlet 拥有一个 service() 方法(这个方法又调用 doPost() 或者 doGet() )来处理请求一样,过滤器拥有单个用于处理请求和响应的方法?D?D doFilter() 。这个方法接受三个输入参数:一个 ServletRequest 、 response 和一个 FilterChain 对象。

destroy() :正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。

SessionFilter.java  
package net.pms.web.filter;  
 
import java.io.IOException;  
 
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
import javax.servlet.http.HttpServletResponseWrapper;  
 
/**  
* @author jfish  
* @since 2006.1.12  
*/  
public class SessionFilter implements Filter {  
 
     public static boolean isContains(String container, String[] regx) {  
           boolean result = false;  
 
           for (int i = 0; i ﹤ regx.length; i++) {  
                 if (container.indexOf(regx[i]) != -1) {  
                       return true;  
                 }  
           }  
           return result;  
     }  
 
     public FilterConfig config;  
 
     public void setFilterConfig(FilterConfig config) {  
           this.config = config;  
     }  
 
     public FilterConfig getFilterConfig() {  
           return config;  
     }  
 
     public void doFilter(ServletRequest request, ServletResponse response,  
                 FilterChain chain) throws IOException, ServletException {  
 
           HttpServletRequest httpreq = (HttpServletRequest) request;  
           HttpServletResponse httpres = (HttpServletResponse) response;  
 
           HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(  
                       (HttpServletResponse) response);  
           String logonStrings = config.getInitParameter("logonStrings");  
           String includeStrings = config.getInitParameter("includeStrings");  
           String redirectPath = httpreq.getContextPath()  
                       + config.getInitParameter("redirectPath");  
           String disabletestfilter = config.getInitParameter("disabletestfilter");  
 
           if (disabletestfilter.toUpperCase().equals("Y")) {  
                 chain.doFilter(request, response);  
                 return;  
           }  
           String[] logonList = logonStrings.split(";");  
           String[] includeList = includeStrings.split(";");  
           Object user = httpreq.getSession().getAttribute("userinfo");  
           if (user == null) {  
                 if (!this.isContains(httpreq.getRequestURI(), includeList)) {  
                       chain.doFilter(request, response);  
                       return;  
                 }  
                 if (this.isContains(httpreq.getRequestURI(), logonList)) {  
                       chain.doFilter(request, response);  
                       return;  
                 }  
                 wrapper.sendRedirect(redirectPath);  
 
           } else {  
                 chain.doFilter(request, response);  
           }  
     }  
 
     public void destroy() {  
           this.config = null;  
     }  
 
     public void init(FilterConfig filterConfig) throws ServletException {  
           this.config = filterConfig;  
     }  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.

4.配置Servlet 过滤器

在web.xml中:

  ﹤filter﹥  
     ﹤filter-name﹥SessionFilter﹤/filter-name﹥  
     ﹤filter-class﹥net.pms.web.filter.SessionFilter﹤/filter-class﹥  
     ﹤init-param﹥  
           ﹤param-name﹥logonStrings﹤/param-name﹥  
           ﹤param-value﹥login.jsp﹤/param-value﹥  
     ﹤/init-param﹥  
     ﹤init-param﹥  
           ﹤param-name﹥includeStrings﹤/param-name﹥  
           ﹤param-value﹥.jsp;.html﹤/param-value﹥  
     ﹤/init-param﹥  
     ﹤init-param﹥  
           ﹤param-name﹥redirectPath﹤/param-name﹥  
           ﹤param-value﹥/login.jsp﹤/param-value﹥  
     ﹤/init-param﹥  
     ﹤init-param﹥  
           ﹤param-name﹥disabletestfilter﹤/param-name﹥  
           ﹤param-value﹥N﹤/param-value﹥  
     ﹤/init-param﹥  
/filter﹥  
﹤filter-mapping﹥  
     ﹤filter-name﹥SessionFilter﹤/filter-name﹥  
     ﹤url-pattern﹥/*﹤/url-pattern﹥  
/filter-mapping﹥ 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

其中参数logonStrings,登陆页面

includeStrings,过滤页面参数

redirectPath,没有登陆转向页面

disabletestfilter,Servlet过滤器是否有效。

【编辑推荐】

  1. Servlet和JSP路径详细介绍
  2. Servlet生命周期
  3. JSP Servlet技术之表单数据浅析
  4. JSP Servlet开发最初那点事
  5. Java Servlet API文档实用说明
责任编辑:仲衡 来源: 百度空间
相关推荐

2021-07-05 15:22:03

Servlet过滤器客户端

2009-07-06 13:02:49

Servlet过滤器

2009-07-08 17:33:37

Servlet过滤器

2009-07-08 16:07:04

Servlet过滤器配

2009-07-08 15:30:56

Servlet过滤器

2011-07-14 13:20:49

Servlet过滤器

2009-07-08 16:10:36

Servlet和JSPJSP页面

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2009-08-25 18:16:02

.NET Framew.NET Framew

2009-06-18 10:13:00

Hibernate过滤

2024-11-04 08:45:48

布隆过滤器元数据指纹值

2009-07-08 10:02:41

Servlet 3.0

2009-09-29 13:55:23

Hibernate设置

2009-07-14 09:09:08

Swing模型过滤器

2011-06-29 16:14:59

Qt 事件 过滤器

2009-07-09 13:45:06

Servlet基本结构

2009-09-09 16:46:59

C# XmlSeria

2016-12-07 09:56:13

JavaFilter过滤器

2009-06-22 11:28:00

Filter结构建立过滤器

2009-09-25 15:19:44

Hibernate过滤
点赞
收藏

51CTO技术栈公众号