JavaWeb_10_过滤器

合集下载

责任链设计模式(过滤器、拦截器)

责任链设计模式(过滤器、拦截器)

责任链设计模式(过滤器、拦截器)责任链设计模式(Chain of Responsibility)的应⽤有:Java Web中的过滤器链、Struts2中的拦截器栈。

先看⼀个问题:给定⼀个字符串“被就业了:),敏感信息,<script>”,对其中的HTML标记和敏感词进⾏过滤或替换。

本⽂主要以该问题设计⽅法的演变来讲解责任链设计模式。

第⼀种设计:没有任何设计模式设计了⼀个MsgProcessor类,完成字符串处理的主要⼯作。

MainClass类是本设计中的测试类。

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30public class MainClass {public static void main(String[] args) {//需要被过滤的语句String msg = "被就业了:),敏感信息,<script>"; //实例化处理类MsgProcessor mp = new MsgProcessor(msg); String r = mp.process();System.out.println(r);}}public class MsgProcessor {private String msg;public MsgProcessor(String msg){this.msg = msg;}public String process(){String r = msg;//过滤msg中的HTML标记r = r.replace("<", "&lt;").replace(">", "&gt;");//过滤敏感词r = r.replace("敏感", "").replace("被就业", "就业"); return r;}}第⼆种设计:增加⼀个Filter接⼝在第⼀种设计中,对字符串的所有处理都放在MsgProcessor类中,扩展性极差。

servlet过滤器工作原理

servlet过滤器工作原理

servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。

其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。

当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。

2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。

3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。

4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。

5. 最后,Servlet容器将处理后的响应发送到客户端。

总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。

通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。

JAVAWEB面试题(含答案)

JAVAWEB面试题(含答案)

1、jsp和servlet的区别、共同点、各自应用的范围??JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。

JSP编译后是“类servlet”。

Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。

而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。

JSP侧重于视图,Servlet主要用于控制逻辑。

在struts框架中,JSP位于MVC设计模式的视图层,而Servlet位于控制层.2、cookie和session的作用、区别、应用范围,session的工作原理Cookie:主要用在保存客户端,其值在客户端与服务端之间传送,不安全,存储的数据量有限。

Session:保存在服务端,每一个session在服务端有一个sessionID作一个标识。

存储的数据量大,安全性高。

占用服务端的内存资源。

3、jstl是什么?优点有哪些??JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,由四个定制标记库(core、format、xml和sql)和一对通用标记库验证器(ScriptFreeTLV和PermittedTaglibsTLV)组成。

优点有:最大程序地提高了WEB应用在各应用服务器在应用程序服务器之间提供了一致的接口,最大程序地提高了1、在应用程序服务器之间提供了一致的接口,之间的移植。

2、简化了JSP和WEB应用程序的开发。

3、以一种统一的方式减少了JSP中的scriptlet代码数量,可以达到没有任何scriptlet 代码的程序。

在我们公司的项目中是不允许有任何的scriptlet代码出现在JSP中。

4、允许JSP设计工具与WEB应用程序开发的进一步集成。

相信不久就会有支持JSTL的IDE 开发工具出现。

4、j2ee的优越性主要表现在哪些方面?MVC模式a、J2EE基于JAVA技术,与平台无关b、J2EE拥有开放标准,许多大型公司实现了对该规范支持的应用服务器。

Java过滤器Filter使用详解

Java过滤器Filter使用详解

Java过滤器Filter使⽤详解<div id="post_detail">转载请注明原⽂地址:在我的项⽬中有具体应⽤:https:///ygj0930/CoupleSpace过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹,在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。

也可以对响应进⾏过滤,拦截或修改响应。

如图,浏览器发出的请求先递交给第⼀个filter进⾏过滤,符合规则则放⾏,递交给filter链中的下⼀个过滤器进⾏过滤。

过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。

当请求通过了链中所有过滤器后就可以访问资源⽂件了,如果不能通过,则可能在中间某个过滤器中被处理掉。

在doFilter()⽅法中,chain.doFilter()前的⼀般是对request执⾏的过滤操作,chain.doFilter后⾯的代码⼀般是对response执⾏的操作。

过滤链代码的执⾏顺序如下:过滤器⼀般⽤于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重⽤,不必每个servlet中还要进⾏相应的操作。

下⾯是过滤器的简单应⽤:1:创建过滤器如图,新建⼀个class,实现接⼝Filter(注意:是javax.servlet中的Filter)。

2:重写过滤器的doFilter(request,response,chain)⽅法。

另外两个init()、destroy()⽅法⼀般不需要重写。

在doFilter⽅法中进⾏过滤操作。

常⽤代码有:获取请求、获取响应、获取session、放⾏。

剩下的代码就是根据session的属性进⾏过滤操作、设置编码格式等等了,看情况⽽定。

HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象HttpSession session=request.getSession();//获取session对象过滤操作代码......chain.doFilter(request, response);//放⾏,通过了当前过滤器,递交给下⼀个filter进⾏过滤3:在web.xml中配置过滤器。

java 中filter过滤器使用方法

java 中filter过滤器使用方法

Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。

它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。

Filters 有许多的应用场合。

Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构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;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。

过滤器获取方法上的注解

过滤器获取方法上的注解

过滤器获取方法上的注解在Java中,过滤器(Filter)是用于拦截请求和响应的一种机制,可以用于实现一些特殊的功能,如权限访问控制、敏感词汇过滤、压缩响应信息等。

要获取方法上的注解,可以使用Java反射机制。

以下是一个简单的示例,演示如何使用反射获取方法上的注解:```javaimport ;public class AnnotationExample {public static void main(String[] args) {try {// 获取目标类的Class对象Class<?> targetClass = ("");// 获取目标方法的方法对象Method method = ("myMethod", );// 获取方法上的注解MyAnnotation myAnnotation = ();// 输出注解的值("MyAnnotation value: " + ());} catch (ClassNotFoundException NoSuchMethodException e) { ();}}}```在上面的示例中,我们首先使用()方法获取目标类的Class对象。

然后,使用getMethod()方法获取目标方法的方法对象。

接着,使用getAnnotation()方法获取方法上的注解。

最后,我们可以访问注解的属性和方法,并输出注解的值。

需要注意的是,获取方法上的注解需要知道注解的类名和方法名,以及目标类的完整类名。

另外,如果目标方法上没有指定该注解,getAnnotation()方法将返回null。

因此,在处理返回值时需要进行空值检查。

java-过滤器Filter_多个Filter的执行顺序

java-过滤器Filter_多个Filter的执⾏顺序【Filter链】*在⼀个web应⽤中,可以开发编写多个Filter,这些Filter组合起来称为⼀个Filter链。

*web服务器根据Filter在web.xml中的注册顺序,决定先调⽤哪个Filter,当第⼀个Filter的doFilter⽅法被调⽤时,web服务器会创建⼀个代表Filter链的FilterChain对象传递给该⽅法,在doFilter⽅法中,开发⼈员如果调⽤了FilterChain对象的doFilter⽅法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调⽤第⼆个filter,如果没有,则调⽤⽬标资源。

【⼯程截图】设计了两个Filter和⼀个Servlet,访问Servlet时,查看Filter的执⾏顺序。

【web.xml】<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" <display-name>FilterDemo01</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 过滤顺序:谁的写在上⾯,谁先被过滤 --><filter><filter-name>FilterTest01</filter-name><filter-class>com.Higgin.web.filter.FilterTest01</filter-class></filter><filter-mapping><filter-name>FilterTest01</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping><filter><filter-name>FilterTest02</filter-name><filter-class>com.Higgin.web.filter.FilterTest02</filter-class></filter><filter-mapping><filter-name>FilterTest02</filter-name><url-pattern>/*</url-pattern> <!-- 过滤所有 --></filter-mapping></web-app>【FilterTest01.java】package com.Higgin.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;public class FilterTest01 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest01 执⾏前---");chain.doFilter(request, response);//让⽬标资源执⾏,即:放⾏System.out.println("FilterTest01 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【FilterTest02.java】package com.Higgin.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;public class FilterTest02 implements Filter{@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out.println("FilterTest02 执⾏前---");chain.doFilter(request, response); //放⾏System.out.println("FilterTest02 执⾏后---");}@Overridepublic void init(FilterConfig arg0) throws ServletException {}@Overridepublic void destroy() {}}【ServletTest01.java】package com.Higgin.web.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class ServletTest01*/@WebServlet("/ServletTest01")public class ServletTest01 extends HttpServlet {private static final long serialVersionUID = 1L;public ServletTest01() {super();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.getWriter().write("中国加油!China Come on!");System.out.println("执⾏ServletTest01---");}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response);}}【运⾏结果】在浏览器中输⼊:http://localhost:8080/FilterDemo01/ServletTest01查看控制台输出结果⾃⼰可以尝试分别注释FilterTest01和FilterTest02中的chain.doFilter⽅法,⽤Junit查看具体的执⾏过程。

java面试题全集(中)--JavaWeb和WebService相关面试题

java⾯试题全集(中)--JavaWeb和WebService相关⾯试题这部分主要是与Java Web和Web Service相关的⾯试题。

96、阐述Servlet和CGI的区别?答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程⽅式运⾏其service()⽅法,⼀个实例可以服务于多个请求,并且其实例⼀般不会销毁,⽽CGI对每个请求都产⽣新的进程,服务完成后就销毁,所以效率上低于Servlet。

补充:Sun Microsystems公司在1996年发布Servlet技术就是为了和CGI进⾏竞争,Servlet是⼀个特殊的Java程序,⼀个基于Java的Web应⽤通常包含⼀个或多个Servlet类。

Servlet不能够⾃⾏创建并执⾏,它是在Servlet容器中运⾏的,容器将⽤户的请求传递给Servlet程序,并将Servlet的响应回传给⽤户。

通常⼀个Servlet会关联⼀个或多个JSP页⾯。

以前CGI经常因为性能开销上的问题被诟病,然⽽Fast CGI早就已经解决了CGI效率上的问题,所以⾯试的时候⼤可不必信⼝开河的诟病CGI,事实上有很多你熟悉的⽹站都使⽤了CGI技术。

97、Servlet接⼝中有哪些⽅法?答:Servlet接⼝定义了5个⽅法,其中前三个⽅法与Servlet⽣命周期相关:- void init(ServletConfig config) throws ServletException- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException- void destory()- ng.String getServletInfo()- ServletConfig getServletConfig()Web容器加载Servlet并将其实例化后,Servlet⽣命周期开始,容器运⾏其init()⽅法进⾏Servlet的初始化;请求到达时调⽤Servlet的service()⽅法,service()⽅法会根据需要调⽤与请求对应的doGet或doPost等⽅法;当服务器关闭或项⽬被卸载时服务器会将Servlet实例销毁,此时会调⽤Servlet的destroy()⽅法。

Filter(过滤器)简介和工作原理

2022-10-27 12:40Filter(过滤器)简介Filter 的基本功能是对Servlet 容器调用Servlet 的过程进行拦截,从而在Servlet 进行响应处理的先后实现一些特殊的功能。

在Servlet API 中定义了三个接口类来开供开辟人员编写Filter 程序:Filter, FilterChain, FilterConfigFilter 程序是一个实现了Filter 接口的Java 类,与Servlet 程序相似,它由Servlet 容器进行调用和执行Filter 程序需要在web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截Jsp, Servlet, 静态图片文件和静态Filter 的基本工作原理当在web.xml 中注册了一个Filter 来对某个Servlet 程序进行拦截处理时,这个Filter 就成为了Servlet 容器与该Servlet 程序vlet 容器发送给Servlet 程序的请求和Servlet 程序回送给Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给Se在一个web 应用程序中可以注册多个Filter 程序,每一个Filter 程序都可以对一个或者一组Servlet 程序进行拦截。

若有多个Filter 程序对某个Servlet 程序的访问过程进行拦截,当针对该Servlet 的访问请求到达时,web 容器将把这多个F 链中各个Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺序一致Filter 接口init(FilterConfig filterConfig)throws ServletException:在web 应用程序启动时,web 服务器将根据web.xml 文件中的配置信存在服务器的内存中。

Web 容器创建Filter 对象实例后,将即将调用该Filter 对象的init 方法。

java web filter过滤器链工作原理

一、引言在Java的Web开发中,过滤器(Filter)是一种十分重要的组件,它可以拦截用户请求并在请求到达Servlet之前或者Servlet响应返回给客户端之前进行一些处理。

而过滤器链(Filter chain)则是由多个过滤器按照一定的顺序组成,它们共同为请求和响应提供处理和转换。

本文将深入探讨Java Web过滤器链的工作原理,包括过滤器链的执行顺序、过滤器链中的过滤器如何协作以及一些常见的应用场景。

二、过滤器链的执行顺序1. 过滤器链中的过滤器是按照在web.xml文件中的配置顺序依次执行的。

在web.xml文件中,每个过滤器都有一个<filter>标签来定义,而<filter>标签的顺序就是过滤器执行的顺序。

2. 过滤器的执行顺序并不是固定的,可以通过修改web.xml文件中<filter-mapping>标签的顺序来改变过滤器的执行顺序。

一般情况下,过滤器链的执行顺序是按照web.xml文件中<filter-mapping>标签的顺序执行的。

3. 过滤器链的最后一个过滤器是请求的目标资源(Servlet或JSP),而请求的目标资源执行完毕后,过滤器链会按照相反的顺序执行,即按照web.xml文件中<filter-mapping>标签的相反顺序执行。

三、过滤器链中的过滤器如何协作1. 过滤器链中的过滤器通过FilterChain对象进行协作。

在过滤器的doFilter()方法中,可以调用FilterChain对象的doFilter()方法将请求传递给下一个过滤器或者目标资源,同时也可以在doFilter()方法中对请求和响应进行一些处理。

2. 过滤器链是一个有序的链表结构,每个过滤器都可以在处理完自己的逻辑之后选择将请求传递给下一个过滤器或者目标资源,也可以选择在自己的逻辑中结束请求的处理并将响应返回给客户端。

3. 过滤器链中的过滤器可以共享同一个HttpServletRequest和HttpServletResponse对象,因此可以进行一些共享数据和状态的操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第1章过滤器在前面的章节分别学习了Servlet技术JSP技术,从本章开始我们将学习一些在Web应用程序中扮演特殊角色的技术、以及一些使用的功能。

在Web应用程序中经常需要处理或控制一些客户端请求以及响应。

比如:请求信息编码处理、响应信息编码处理、权限验证、防盗链等。

这些使用普通的JSP和Servlet实现很繁琐,因为需要在每个JSP和Servlet中编写一段相同的代码,不利于系统的维护。

使用本章讲解的过滤器就可以解决这类问题。

1.1 过滤器介绍Servlet过滤器是J2EE Web应用程序级的Java代码组件,是一种类似于Servlet,由容器管理的对象,它能够以声明的方式插人到HTTP请求响应的过程中。

它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。

它是通常封装了一些功能的类,实现了对Web应用程序中的预处理和后期处理逻辑。

过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中。

这些组件通过Web部署描述符(web.xml)配置文件来声明,可以方便地添加和删除过滤器,无需改动任何应用程序代码或JSP页面,并由Servlet容器进行动态调用。

通过在请求/响应链中使用过滤器,可以对应用程序(而不是以任何方式替代)的Servlet或JSP页面提供的核心处理进行补充,而不会破坏Servlet或JSP页面的功能。

由于是纯Java实现,所以Servlet过滤器是跨平台和跨容器可移植的,从而进一步支持了Servler过滤器的模块化和可重用性,使得它们很容易地被部署到任何相容的J2EE环境中。

图1-1 过滤器原理如图1-1所示,当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。

请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。

当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。

同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

如图1-1所示:在Servlet2.4规范中对2.3规范进行了扩展,使得Servlet过滤器可以应用在客户机和Servlet之间、Servlet和Servlet、Servlet和JSP页面之间、以及各个JSP页面之间。

1.2 过滤器APIServlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。

1、Filter接口所有的过滤器都必须实现Filter接口。

Filter接口定义了过滤器的相关规范,主要定义了init()、doFilter()、destory()三个方法,其源代码如下:init():当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。

doFilter():每个过滤器都接受当前的请求和响应,而FilterChain包含的过滤器则仍然必须被处理。

doFilter()方法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。

过滤器通过传送至此方法的FilterChain参数,调用chain.doFilter()将控制权传送给下一个过滤器。

当这个调用返回后,过滤器可以在它的doFilter()方法的最后对响应做些其他的工作。

如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。

当链中的最后一个过滤器调用chain.doFilter()方法时,将运行最初请求的Servlet。

destroy():一旦doFilter()方法里的所有线程退出或已超时,容器调用此方法。

服务器调用destory()以指出过滤器已结束服务,用于释放过滤器占用的资源。

2、FilterChain接口接口Filter的方法doFilter()是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。

3、FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。

该接口提供了以下四个方法:getFilterName()返回web.xml部署文件中定义的该过滤器的名称。

getServletContext()返回调用者所处的servlet上下文。

getInitParameter(String)返回过滤器初始化参数值的字符串形式,当参数不存在时,返回初始化参数名。

getInitParameterNames()以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空。

在编写Filter实现类是,并不用关心FilterChain、FilterConfig的实现类,因为在Filter实现类中,这两个接口的引用是由服务器创建,如Tomcat服务器。

1.3 过滤器的使用过滤器的使用分为两步:一是创建过滤器类,实现功能的封装;二是在web.xml中配置过滤器的过滤范围,使之生效。

如使用过滤器来处理如例1-1所示的Servlet信息。

例1-1:DisplayServlet由于没有进行中文处理,响应的中文内容将以乱码的形式显示在页面,如图1-2所示。

图1-2 未处理编码的servlet1.3.1 创建过滤器创建过滤器很简单,只要实现Filter接口、并实现相应的方法即可。

如常用的过滤器之一就是请求、响应对象的编码处理,过滤器实现代码如例1-2所示。

例1-2:中文处理过滤器在过滤器中doFilter()方法是过滤的主方法,在该方法中如果想让请求通过过滤器访问目标,就必须调用FilterChain对象的foFilter()方法,否则请求将被阻止。

1.3.2 过滤器配置创建的过滤器只是一个普通的实现了Filter接口的java类,想让该类实现过滤功能,就必须在web.xml中配置,让其发挥作用。

在web.xml中使用filter、filter-mapping以及其子标签实现过滤器的配置,比如配置中文处理过滤器的代码如下:在web.xml配置文件中:filter标签:用于配置一个过滤器。

通过子标签filter-name为过滤器取名,子标签filter-class指定过滤器实现类的包路径即类名。

filter-mapping标签:用于指定某个过滤的过滤范围。

通过子标签filter-name指定配置的过滤器名,和filter标签中配置的名称相对应;子标签url-pattern指定过滤范围,当要过滤某个目录下所有的请求时使用“*”代替、或者单独配置某一个确切的路径,如:但是不能使用后缀名匹配的方式、如“/*.jsp”就是错误的。

在上面的配置中“/*”代表该过滤器对当前web应用程序的所有请求都起作用。

一个filter可以配置多个filter-mapping。

重新启动服务器,过滤器将过滤响应的请求。

此时访问DisplayServlet将看到如图1-3所示的效果。

图1-3 过滤器处理中文效果1.3.3 过滤器参数过滤器想Servlet一样可以配置一些初始化参数,这些参数可以灵活控制过滤器的运行。

过滤器的初始化参数可以通过web.xml中的init-param标签配置。

如例1-3通过init-param 在web.xml中配置编码过滤器的初始化参数。

例1-3:过滤器初始化参数在过滤器实现类EncodingFilter中修改代码如下:在初始化方法中,通过FilterConfig得到初始化参数,名称必须和web.xml中的参数名相对应。

重启服务器,访问DisplayServlet内容如图1-4所示。

图1-4 过滤器参数设置编码1.4 过滤器生命周期过滤器的生命周期和Servlet的生命周期基本一致,主要包含:类加载、实例化、初始化、过滤、销毁。

其中类加载、实例化、初始化工作是在服务器启动时就执行、过滤是在每次访问时执行、销毁时在服务器停止时执行。

如例1-4所示,在每个生命周期方法中打印相应的提示信息,用于观察过滤器的生命周期。

例1-4:过滤器生命周期在web.xml中配置过滤器的有效范如下:通过配置可以看出,LifeFilter过滤器对该web应用程序下的所有请求都起作用。

当启动web 应用程序是可以看到如图1-5所示的LifeFilter启动信息。

图1-5 启动服务当访问服务器上的每一个资源时都将看到如图1-6所示的LifeFilter过滤信息。

图1-6 访问web资源当服务器停止时将执行销毁方法。

1.5 过滤器链当多个过滤器对同一资源路径有效时就形成了过滤器链,也就是说在同一个Web应用程序中有多个过滤器。

过滤器链的原理就像现实生活中一道一道的门,比如在卧室有你所想要的东西,你必须点通过房屋的大门进入客厅,然后再经过卧室的门进入卧室,取得你所需要的东西,然后走出卧室、再走出房屋。

这里的房屋就相当于web应用程序、卧室存放的物品就是web应用程序中的资源、门就相当于过滤器(大门是第一个过滤器、卧室的门是第二个过滤器)。

从这个例子我们可以看出在多个过滤器作用于同一个web资源是,过滤器的过滤顺序是先进后出的原则。

其原理如图1-7所示。

图1-7 过滤器链例1-5:过滤器链本例通过在每个过滤器中打印相应的提示信息来观察过滤器链的执行过程。

创建过滤器OneFilter、TwoFilter、test.jsp即配置内容非别如下:OneFilterTwoFilterweb.xml配置test.jsp当访问web应用程序资源test.jsp时将看到如图1-8所示的过滤器链执行流程。

图1-8 过滤器链由图1-8可以看出过滤器链中的过滤器执行是先进后出的原则,通过修改web.xml中过滤器的配置顺序可以改变过滤器链中每个过滤器的先后顺序,web.xml中配置在前的过滤器将先执行、配置在后的过滤器将后执行。

相关文档
最新文档