在filtermapping元素中定义dispatcher有什么作用

实现与设置过滤器
本文所属图书&>&
本书针对Servlet 3.0的新功能全面改版,无论章节架构还是范例程序代码,都做了全面更新。书中详细介绍了Servlet/JSP与Web容器之间的关系,必要时从Tomcat源代码分析,了解Servlet/JSP如何与容器互动。本书还涵盖...&&
在Servlet/JSP中要实现过滤器,必须实现Filter接口,并使用@WebFilter标注或在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。Filter接口有三个要实现的方法:init()、doFilter()与destroy()。
package javax.
import java.io.IOE
public interface Filter {
&&& public void init(FilterConfig filterConfig) throws ServletE
&&& public void doFilter(ServletRequest request,
&&&&&&&&&&&&&&&&&&&&&&&& ServletResponse response,
&&&&&&&&&&&&&&&&&&&&&&&& FilterChain chain) throws IOException, ServletE
&&& public void destroy();
FilterConfig类似于Servlet接口init()方法参数上的ServletConfig,FilterConfig是实现Filter接口的类上使用标注或web.xml中过滤器设置信息的代表对象。如果在定义过滤器时设置了初始参数,则可以通过FilterConfig的getInitParameter()方法来取得初始参数。
Filter接口的doFilter()方法则类似于Servlet接口的service()方法。当请求来到容器,而容器发现调用Servlet的service()方法前,可以应用某过滤器时,就会调用该过滤器的doFilter()方法。可以在doFilter()方法中进行service()方法的前置处理,而后决定是否调用FilterChain的doFilter()方法。
如果调用了FilterChain的doFilter()方法,就会运行下一个过滤器,如果没有下一个过滤器了,就调用请求目标Servlet的service()方法。如果因为某个情况(如用户没有通过验证)而没有调用FilterChain的doFilter(),则请求就不会继续交给接下来的过滤器或目标Servlet,这时就是所谓的拦截请求(从Servlet的观点来看,根本不知道有发出请求)。FilterChain的doFilter()实现,概念上类似以下:
Filter filter = filterIterator.next();
if(filter != null) {
&&& filter.doFilter(request, response, this);
&&& targetServlet.service(request, response);
在陆续调用完Filter实例的doFilter()仍至Servlet的service()之后,流程会以堆栈顺序返回,所以在FilterChain的doFilter()运行完毕后,就可以针对service()方法做后续处理。
// service()前置处理
chain.doFilter(request, response);
// service()后置处理
只需要知道FilterChain运行后会以堆栈顺序返回即可。在实现Filter接口时,不用理会这个Filter前后是否有其他Filter,应该将之作为一个独立的元件设计。
如果在调用Filter的doFilter()期间,因故抛出UnavailableException,此时不会继续下一个Filter,容器可以检验异常的isPermanent(),如果不是true,则可以在稍后重试Filter。
Servlet/JSP提供的过滤器机制,其实是Java EE设计模式中Interceptor Filter模式的实现。如果希望可以弹性地抽换某功能的前置与后置处理元件(例如Servlet/JSP中Servlet的service()方法的前置与后置处理),就可以应用Interceptor Filter模式。
以下实现一个简单的性能评测过滤器,可用来记录请求与响应间的时间差,了解Servlet处理请求到响应所需花费的时间。
FilterDemo& PerformanceFilter.java
package cc.
import java.io.IOE
import javax.servlet.F
import javax.servlet.FilterC
import javax.servlet.FilterC
import javax.servlet.ServletE
import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.annotation.WebF
@WebFilter(filterName=&performance&, urlPatterns={&/*&})
public class PerformanceFilter implements Filter {
&&& private FilterC&&&
&&& @Override
&&& public void init(FilterConfig config) throws ServletException {
&&&&&&& this.config =
&&& @Override
&&& public void doFilter(ServletRequest request,
&&&&&&&&&&&&&&&&&&&&&&&& ServletResponse response,
&&&&&&&&&&&&&&&&&&&&&&&& FilterChain chain)
&&&&&&&&&&&&&&&&&&&&&&&&&&&& throws IOException, ServletException {
&&&&&&& long begin = System.currentTimeMillis();
&&&&&&& chain.doFilter(request, response);
&&&&&&& config.getServletContext().log(&Request process in & +
&&&&&&&&&&&&&&& (System.currentTimeMillis() - begin) + & milliseconds&);
&&& @Override
&&& public void destroy() {}
当过滤器类被载入容器时并实例化后,容器会运行其init()方法并传入FilterConfig对象作为参数。在doFilter()的实现中,先记录目前的系统时间,接着调用FilterChain的doFilter()继续接下来的过滤器或Servlet,当FilterChain的doFilter()返回时,取得系统时间并减去先前记录的时间,就是请求与响应间的时间差。
过滤器的设置与Servlet的设置很类似。@WebFilter中的filterName设置过滤器名称,urlPatterns设置哪些URL请求必须应用哪个过滤器,可应用的URL模式与Servlet基本上相同,而&/*&表示应用在所有的URL请求,过滤器还必须实现Filter接口。
如果要在web.xml中设置,则可以如下所示,标注的设置会被web.xml中的设置覆盖:
&&& &filter&
&&&&&&& &filter-name&performance&/filter-name&
&&&&&&& &filter-class&cc.openhome.PerformanceFilter&/filter-class&
&&& &/filter&
&&& &filter-mapping&
&&&&&&& &filter-name&performance&/filter-name&
&&&&&&& &url-pattern&/*&/url-pattern&
&&& &/filter-mapping&
&filter&标签中使用&filter-name&与&filter-class&设置过滤器名称与类名称。而在&filter-mapping&中,则用&filter-name&与&url-pattern&来设置哪些URL请求必须应用哪个过滤器。
在过滤器的请求应用上,除了指定URL模式之外,也可以指定Servlet名称,这可以通过@WebServlet的servletNames来设置:
@WebFilter(filterName=&performance&, servletNames={&SomeServlet&})
或在web.xml的&filter-mapping&中使用&servlet-name&来设置:
&&& &filter-mapping&
&&&&&&& &filter-name&performance&/filter-name&
&&&&&&& &servlet-name&SomeServlet&/servlet-name&
&&& &/filter-mapping&
如果想一次符合所有的Servlet名称,则可以使用星号(*)。如果在过滤器初始化时,想要读取一些参数,可以在@WebFilter中使用@WebInitParam设置initParams。例如:
@WebFilter(
&&& filterName=&performance&,
&&& urlPatterns={&/*&}, servletNames={&&},
&&& initParams={
&&&&&&& @WebInitParam(name = &PARAM1&, value = &VALUE1&),
&&&&&&& @WebInitParam(name = &PARAM2&, value = &VALUE2&)
public class PerformanceFilter implements Filter {
&&& private String PARAM1;
&&& private String PARAM2;
&&& @Override
&&& public void init(FilterConfig config) throws ServletException {
&&&&&&& PARAM1 = config.getInitParameter(&PARAM1&);
&&&&&&& PARAM2 = config.getInitParameter(&PARAM2&);
若要在web.xml中设置过滤器的初始参数,可以在&filter&标签中使用&init-param&进行设置,web.xml中的设置会覆盖标注的设置。例如:
&&& &filter&
&&&&&&& &filter-name&PerformanceFilter&/filter-name&
&&&&&&& &filter-class&cc.openhome.PerformanceFilter&/filter-class&
&&&&&&& &init-param&
&&&&&&&&&&& &param-name&PARAM1&/param-name&
&&&&&&&&&&& &param-value&VALUE1&/param-value&
&&&&&&& &/init-param&
&&&&&&& &init-param&
&&&&&&&&&&& &param-name&PARAM2&/param-name&
&&&&&&&&&&& &param-value&VALUE2&/param-value&
&&&&&&& &/init-param&
&&& &/filter&
触发过滤器的时机,默认是直接发出请求。如果是那些通过Request- Dispatcher的forward()或include()的请求,设置@WebFilter的dispatcherTypes。例如:
@WebFilter(
&&& filterName=&some&,
&&& urlPatterns={&/some&},
&&& dispatcherTypes={
&&&&&&&& DispatcherType.FORWARD,
&&&&&&&& DispatcherType.INCLUDE,
&&&&&&&& DispatcherType.REQUEST,
&&&&&&&& DispatcherType.ERROR, DispatcherType.ASYNC
如果不设置任何dispatcherTypes,则默认为REQUEST。FORWARD就是指通过RequestDispatcher的forward()而来的请求可以套用过滤器。INCLUDE就是指通过RequestDispatcher的include()而来的请求可以套用过滤器。ERROR是指由容器处理例外而转发过来的请求可以触发过滤器。ASYNC是指异步处理的请求可以触发过滤器(之后还会说明异步处理)。
若要在web.xml中设置,则可以使用&dispatcher&标签。例如:
&&& &filter-mapping&
&&&&&&& &filter-name&SomeFilter&/filter-name&
&&&&&&& &servlet-name&*.do&/servlet-name&
&&&&&&& &dispatcher&REQUEST&/dispatcher&
&&&&&&& &dispatcher&FORWARD&/dispatcher&
&&&&&&& &dispatcher&INCLUDE&/dispatcher&
&&&&&&& &dispatcher&ERROR&/dispatcher&
&&&&&&& &dispatcher&ASYNC&/dispatcher&
&&& &/filter-mapping&
可以通过&url-pattern& 或&servlet-name&来指定,哪些URL请求或哪些Servlet可应用过滤器。如果同时具备&url-pattern&与&servlet-name&,则先比对&url-pattern&,再比对&servlet-name&。如果有某个URL或Servlet会应用多个过滤器,则根据&filter-mapping&在web.xml中出现的先后顺序,来决定过滤器的运行顺序。
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&
您的浏览器不支持嵌入式框架,或者当前配置为不显示嵌入式框架。FilterDispatcher作用_百度知道
FilterDispatcher作用
【FilterDispatcher作用】核心控制器FilterDispatcher是STRUTS 2框架的基础,包含了框架内部的控制流程和处理机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。主要作用如下:1、执行action:过滤器根据请求的url判断是否需要调用action(判断的依据是根据actionMapper)如果需要执行action那么处于过滤器链中的其他过滤器将终止,并且调用action.这意味着其他一些一定要执行的过滤器必须放在FilterDispatcher前面.以保证他们的执行。2、清空ActionContext上下文:FilterDispatcher讲自动的清除上下文,确保没有内存泄露.但是有时候将导致在集成其他产品时出现某些问题。3、服务静态的内容:FilterDispatcher同时会加载常用的静态内容,例如javascript文件,css文件。FilterDispatcher会查找/struts/*这个目录,并且映射&/struts/&后面的的所有常用的包。4、中断请求生命周期中的XWORKS拦截器。
其他类似问题
为您推荐:
需要配置web.xml:
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app id=&WebApp_ID& version=&2.4& xmlns=&& xmlns:xsi=&& xsi:schemaLocation=& &&
&display-name&
struts2Test&/display-name&
&filter-name&struts2&/filter-name&
&filter-class&org.apache.struts2.dispatcher.FilterDispatcher&/filter-class&
&filter-mapping&
&filter-name&struts2&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&welcome-file-list&
&welcome-file&index.html&/welcome-file&
&welcome-file&index.htm&lt...
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&&&&&Filter从字面意思理解为过滤器,过滤等意思,想到过滤,顾名思义,就是要对通过的东西做相关检查,通过用户自定义的规则去筛选事物,比如,在你登机的时候,要对每个乘客进行安检,这个安检就相当于一个过滤器,规定不允许你携带易燃易爆等物品这相当于过滤器定义的规则,也可以是过滤器的内容,上面只是通过生活中的细节来描述Filter的,下面就看在java中专业的定义。一、Filter的介绍及使用什么是过滤器?与Servlet相似,过滤器是一些web应用程序组件,可以绑定到一个web应用程序中。但是与其他web应用程序组件不同的是,过滤器是&链&在容器的处理过程中的。这就意味着它们会在servlet处理器之前访问一个进入的请求,并且在外发响应信息返回到客户前访问这些响应信息。这种访问使得过滤器可以检查并修改请求和响应的内容。过滤器适用于那些地方?l为一个web应用程序的新功能建立模型(可被添加到web应用程序中或者从web应用程序中删除而不需要重写基层应用程序代码);l向过去的代码添加新功能。过滤器放在容器结构的什么位置?过滤器放在web资源之前,可以在请求抵达它所应用的web资源(可以是一个Servlet、一个Jsp页面,甚至是一个HTML页面)之前截获进入的请求,并且在它返回到客户之前截获输出请求。Filter:用来拦截请求,处于客户端与被请求资源之间,目的是重用代码。Filter链,在web.xml中哪个先配置,哪个就先调用。在filter中也可以配置一些初始化参数。Java中的Filter&并不是一个标准的Servlet&,它不能处理用户请求,也不能对客户端生成响应。&主要用于对HttpServletRequest&进行预处理,也可以对HttpServletResponse&进行后处理,是个典型的处理链。&Filter&有如下几个用处:l在HttpServletRequest&到达Servlet&之前,拦截客户的HttpServletRequest&。&l根据需要检查HttpServletRequest&,也可以修改HttpServletRequest&头和数据。&l在HttpServletResponse&到达客户端之前,拦截HttpServletResponse&。&l根据需要检查HttpServletResponse&,可以修改HttpServletResponse&头和数据。Filter&有如下几个种类:l用户授权的Filter: Filter&负责检查用户请求,根据请求过滤用户非法请求。&l日志Filter:&详细记录某些特殊的用户请求。&l负责解码的Filter:&包括对非标准编码的请求解码。&l能改变XML&内容的XSLTFilter&等。&一个Filter&可负责拦截多个请求或响应:一个请求或响应也可被多个请求拦截。&创建一个Filter&只需两个步骤:&(1)创建Filter&处理类:&(2)在web.xml&文件中配置Filter&。&创建Filter&必须实现javax.servlet.Filter&接口,在该接口中定义了三个方法。&o void init(FilterConfig config):&用于完成Filter&的初始化。&o void destroy():&用于Filter&销毁前,完成某些资源的回收。&o void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):&实现过滤功能,该方法就是对每个请求及响应增加的额外处理。&过滤器Filter也具有生命周期:init()-&doFilter()-&destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,&dispatcher&INCLUDE或FORWARD或REQUEST或ERROR&/dispatcher&该元素位于filter-mapping中。&Filter常用的场景:例一、日志的记录,当有请求到达时,在该过滤器中进行日志的记录。处理完成后,进入后续的Filter或者处理。步骤1:编写Filter类package&test.&import&javax.servlet.Fimport&javax.servlet.FilterCimport&javax.servlet.FilterCimport&javax.servlet.ServletCimport&javax.servlet.ServletRimport&javax.servlet.ServletRimport&javax.servlet.http.HttpServletR&public&class&LogFilter&implements&Filter {&&&&&private&FilterConfig&config;&&&&&//&实现初始化方法&&&&&public&void&init(FilterConfig config) {&&&&&&&&&this.config&=&&&&&}&&&&&//&实现销毁方法&&&&&public&void&destroy() {&&&&&&&&&this.config&=&null;&&&&&}&&&&&public&void&doFilter(ServletRequest request, ServletResponse response,&&&&&&&&&&&&&FilterChain chain) {&&&&&&&&&//&获取ServletContext&对象,用于记录日志&&&&&&&&&ServletContext context =&this.config.getServletContext();&&&&&&&&&long&before = System.currentTimeMillis();&&&&&&&&&System.out.println(&开始过滤... &);&&&&&&&&&//&将请求转换成HttpServletRequest&请求&&&&&&&&&HttpServletRequest hrequest = (HttpServletRequest)&&&&&&&&&//&记录日志&&&&&&&&&context.log(&Filter已经截获到用户的请求的地址: &&+ hrequest.getServletPath());&&&&&&&&&try&{&&&&&&&&&&&&&// Filter&只是链式处理,请求依然转发到目的地址。&&&&&&&&&&&&&chain.doFilter(request, response);&&&&&&&&&}&catch&(Exception e) {&&&&&&&&&&&&&e.printStackTrace();&&&&&&&&&}&&&&&&&&&long&after = System.currentTimeMillis();&&&&&&&&&//&记录日志&&&&&&&&&context.log(&过滤结束&);&&&&&&&&&//&再次记录日志&&&&&&&&&context.log(&&请求被定位到&&+ ((HttpServletRequest) request).getRequestURI()&&&&&&&&&&&&&&&&&+&&所花的时间为: &&+ (after - before));&&&&&}&}&在上面的请求Filter中,仅在日志中记录请求的URL,对所有的请求都执行chain.doFilter(request,reponse)方法,当Filter&对请求过滤后,依然将请求发送到目的地址。步骤2:在web.xml中配置Filter&!--&定义Filter --&&&filter&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name&log&/filter-name&&&&&&&!-- Filter&的实现类&--&&&&&&&filter-class& test.filter.LogFilter&/filter-class&&&/filter&&&!--&定义Filter&拦截地址&--&&&filter-mapping&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name&log&/filter-name&&&&&&&!-- Filter&负责拦截的URL --&&&&&&&url-pattern&/filter/*&/url-pattern&&/filter-mapping&&通过上述步骤的操作,此时就可以通过URI进行访问。具体访问后会在log文件中的localhost文件中产生具体的访问日志。如下所示: 21:12:50 org.apache.catalina.core.ApplicationContext log信息:&&请求被定位到/examples/jsp/jsp2/el/basic-arithmetic.jsp所花的时间为: 0 21:14:55 org.apache.catalina.core.ApplicationContext log信息: Filter已经截获到用户的请求的地址: /jsp/jsp2/el/basic-comparisons.jsp 21:14:56 org.apache.catalina.core.ApplicationContext log信息:&过滤结束例二、进行编码的修正,当有新的请求时,需要将用户传送过来的字符进行重新编码,以使其可以满足服务器的编码格式。1、编写EncodingFilter类package&test.import&java.io.IOEimport&javax.servlet.Fimport&javax.servlet.FilterCimport&javax.servlet.FilterCimport&javax.servlet.ServletCimport&javax.servlet.ServletEimport&javax.servlet.ServletRimport&javax.servlet.ServletR&public&class&EncodingFilter&implements&Filter {&&&&&&&private&FilterConfig&filterConfig&=&null;&&&&private&String&encoding&=&null;&&&&&&&//实现销毁方法&&&&public&void&destroy() {&&&&&&&&&&&&encoding&=&null;&&&&&&&&}&&&&&&&//进行具体的过滤&&&&public&void&doFilter(ServletRequest request, ServletResponse response,&&&&&&&&&&&&&&&&FilterChain chain)&throws&IOException, ServletException {&&&&&&&&//&获取ServletContext&对象,用于记录日志&&&&&&&&&&ServletContext context =&this.filterConfig.getServletContext();&&&&&&&&&&context.log(&开始设置编码格式&);&&&&&&&&&String encoding = getEncoding();&&&&&&&&&&&&if&(encoding ==&null){&&&&&&&&&&&&&&&&encoding =&&gb2312&;&&&&&&&&&&&&}&&&&&&&&&//&在请求里设置上指定的编码&&&&&&&&&request.setCharacterEncoding(encoding);&&&&&&&&&chain.doFilter(request, response);&&&&&&&&&&&context.log(&成功设置了编码格式&);&&&&&}&&&&&&&//初始化配置&&&&public&void&init(FilterConfig filterConfig)&throws&ServletException {&&&&&&&&this.filterConfig&= filterC&&&&&&&&this.encoding&= filterConfig.getInitParameter(&encoding&);&&&&&&&&}&&&&&&&&&&private&String getEncoding() {&&&&&&&&&&&return&this.encoding;&&&&&&&&}&&&}&步骤2:在web.xml中配置Filter&!--&定义Filter --&&&filter&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name&encoding&/filter-name&&&&&&&!-- Filter&的实现类&--&&&filter-class& test.filter.EncodingFilter&/filter-class&&init-param&&&&&param-name&encoding&/param-name&&&&&param-value&gb2312&/param-value&&&&&/init-param&&&&&/filter&&&!--&定义Filter&拦截地址&--&&&filter-mapping&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name& encoding &/filter-name&&&&&&&!-- Filter&负责拦截的URL --&&&&&&&url-pattern&/encode/*&/url-pattern&&&/filter-mapping&&通过上述步骤的操作,此时就可以通过URI进行访问。例三、用户权限的认证,当用户发送请求时,可以对用户的身份信息进行验证,如果能够通过验证则接下来再进行其它操作,否则直接不进入下一步的处理。1、编写身份认证SecurityFilter类package&test.import&java.io.IOEimport&javax.servlet.Fimport&javax.servlet.FilterCimport&javax.servlet.FilterCimport&javax.servlet.ServletCimport&javax.servlet.ServletEimport&javax.servlet.ServletRimport&javax.servlet.ServletRimport&javax.servlet.http.HttpServletRimport&javax.servlet.http.HttpServletRimport&javax.servlet.http.HttpS&public&class&SecurityFilter&implements&Filter {&&&&private&FilterConfig&filterConfig;&&&&//初始化方法实现&&&&@Override&&&&public&void&init(FilterConfig filterConfig)&throws&ServletException {&&&&&&&&this.filterConfig&= filterC&&&&}&&&&//身份认证的过滤&&&&@Override&&&&public&void&doFilter(ServletRequest request, ServletResponse response, FilterChain chain)&&&&&&&&&&&&throws&IOException, ServletException {&&&&&&&&ServletContext context =&this.filterConfig.getServletContext();&&&&&&&&HttpServletRequest req = (HttpServletRequest)&&&&&&&&HttpServletResponse res = (HttpServletResponse)&&&&&&&&&HttpSession session = req.getSession();&&&&&&&&//登录后才能进入下一步处理,否则直接进入错误提示页面&&&&&&&&if&(session.getAttribute(&username&) !=&null) {&&&&&&&&&&&&context.log(&身份认证通过,进入下一步处理&&);&&&&&&&&&&&&chain.doFilter(request, response);&&&&&&&&}&else&{&&&&&&&&&&&&context.log(&身份认证失败,直接返回&);&&&&&&&&&&&&res.sendRedirect(&../failure.jsp&);&&&&&&&&}&&&&}&&&&//实现销毁方法&&&&@Override&&&&public&void&destroy() {&&&&&&&&this.filterConfig&=&null;&&&&}}步骤2:在web.xml中配置Filter&!--&定义Filter --&&&filter&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name&security&/filter-name&&&&&&&!-- Filter&的实现类&--&&&filter-class& test.filter.SecurityFilter&/filter-class&&/filter&&&!--&定义Filter&拦截地址&--&&&filter-mapping&&&&&&&!-- Filter&的名字&--&&&&&&&filter-name& security &/filter-name&&&&&&&!-- Filter&负责拦截的URL --&&&&&&&url-pattern&/security/*&/url-pattern&&&/filter-mapping&通过上述步骤的操作,此时就可以通过URI进行访问。此时如果能够取得Session中的username值时,会直接进入下一步处理,否则直接进入错误页面。二、过滤链FilterChain&两个过滤器,EncodingFilter负责设置编码,SecurityFilter负责控制权限,服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如下图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。&执行的代码顺序是:&l执行EncodingFilter.doFilter()中chain.doFilter()之前的部分;request.setCharacterEncoding(encoding);l执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。l如果用户已登录,则访问请求的资源。l如果用户未登录,则页面重定向到:/failure.jsp。l执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。l执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:写入已经完成的日志。过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。}

我要回帖

更多关于 filter mapping 多个 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信