`
TechBirds
  • 浏览: 82544 次
文章分类
社区版块
存档分类
最新评论

Servlet中的Filter在Struts2中的执行流程

阅读更多

1.Servlet中filter的执行流程可以依照web.xml中的filter配置进行顺序执行。我们知道web.xml中元素执行的顺序 context-param->listener->filter->servlet。

且无论这类元素摆放位置如何,都是遵循这个原则的。

下面看个例子

web.xml的配置:

	<!-- 编码过滤器 -->
 	<filter>
 		<filter-name>setCharacterEncoding</filter-name>
 		<filter-class>com.company.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>
 		<init-param>
 			<param-name>encoding</param-name>
 			<param-value>utf-8</param-value>
 		</init-param>
 	</filter>
 	<filter-mapping>
 		<filter-name>setCharacterEncoding</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>
 	<!-- 一个简单的sevlet读取init参数的配置 -->
 	<servlet>
 		<servlet-name>helloworld</servlet-name>
 		<servlet-class>com.company.strutstudy.web.servletstudy.servlet.HelloWorldServlet</servlet-class>
 		<init-param>
 			<param-name>encoding</param-name>
 			<param-value>UTF-8</param-value>
 		</init-param>
 	</servlet>
 	<servlet-mapping>
 		<servlet-name>helloworld</servlet-name>
 		<url-pattern>/hello</url-pattern>
 	</servlet-mapping>
 	<!--禁用浏览器缓存的过滤器 -->
 	<filter>
 		<filter-name>nocachefilter</filter-name>
 		<filter-class>com.company.strutstudy.web.servletstudy.filter.NoCacheFilter</filter-class>
 	</filter>
 	<filter-mapping>
 		<filter-name>nocachefilter</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>
执行结果:

before encoding utf-8 filter!
cache do the before!
doservice...UTF-8
doget...
dopost...
cache do the after!
after encoding utf-8 filter!
ps:servlet在filter配置之前,那filter也会进行执行,且在servlet之前。
2.在struts2中配置执行filter,经过debug源码发现,一旦这个filter配置在struts2的filterDispatcher后面,在filterDispatcher中的dofilter中会自动过滤掉该filter。

web.xml的配置:

<!-- 编码过滤器 -->
 	<filter>
 		<filter-name>setCharacterEncoding</filter-name>
 		<filter-class>com.company.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>
 		<init-param>
 			<param-name>encoding</param-name>
 			<param-value>utf-8</param-value>
 		</init-param>
 	</filter>
 	<filter-mapping>
 		<filter-name>setCharacterEncoding</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping> 
 	<!-- 加载struts2核心 -->
 	<filter>
 		<filter-name>StrutsFilter</filter-name>
 		<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 		<init-param>
 			<param-name>packages</param-name>
 			<param-value>com.company.strutstudy.web.action</param-value>
 		</init-param>
 	</filter>
 	<filter-mapping>
 		<filter-name>StrutsFilter</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>
 	<!--禁用浏览器缓存的过滤器 -->
 	<filter>
 		<filter-name>nocachefilter</filter-name>
 		<filter-class>com.company.strutstudy.web.servletstudy.filter.NoCacheFilter</filter-class>
 	</filter>
 	<filter-mapping>
 		<filter-name>nocachefilter</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>

EncodingFilter源码:

public class EncodingFilter implements Filter {
 	private String encoding;
 	private Map<String, String> params = new HashMap<String, String>();
 	// 项目结束时就已经进行销毁
 	public void destroy() {
 		System.out.println("end do the encoding filter!");
 		params=null;
 		encoding=null;
 	}
 	public void doFilter(ServletRequest req, ServletResponse resp,
 			FilterChain chain) throws IOException, ServletException {
 		//UtilTimerStack.push("EncodingFilter_doFilter:");
 		System.out.println("before encoding " + encoding + " filter!");
 		req.setCharacterEncoding(encoding);
 		// resp.setCharacterEncoding(encoding);
 		// resp.setContentType("text/html;charset="+encoding);
 		chain.doFilter(req, resp);
 		System.out.println("after encoding " + encoding + " filter!");
 		System.err.println("----------------------------------------");
 		//UtilTimerStack.pop("EncodingFilter_doFilter:");
 	}
 
 	// 项目启动时就已经进行读取
 	public void init(FilterConfig config) throws ServletException {
 		System.out.println("begin do the encoding filter!");
 		encoding = config.getInitParameter("encoding");
 		for (Enumeration e = config.getInitParameterNames(); e
 				.hasMoreElements();) {
 			String name = (String) e.nextElement();
 			String value = config.getInitParameter(name);
 			params.put(name, value);
 		}
 	}
 }
Struts2中的FilterDipatcher中的doFilter方法源码:

      /**
      * 当执行完编码Filter后,filter链表对象filterchain会执行其后的配置的filterDispatcher,随后执行该filter的dofilter方法。
      */ 
     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
         HttpServletRequest request = (HttpServletRequest) req;
         HttpServletResponse response = (HttpServletResponse) res;
         ServletContext servletContext = getServletContext();
         String timerKey = "FilterDispatcher_doFilter: ";
         try {
             UtilTimerStack.push(timerKey);
             request = prepareDispatcherAndWrapRequest(request, response);
             ActionMapping mapping;
             try {
             	//得到存储Action信息的ActionMapping对象,actionMapper被注入,如何被注入待研究
                 mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());
             } catch (Exception ex) {
                 LOG.error("error getting ActionMapping", ex);
                 dispatcher.sendError(request, response, servletContext, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, ex);
                 return;
             }
             if (mapping == null) {//如果这个请求是action请求,那么这里得到的mapping不会是null
                 // there is no action in this request, should we look for a static resource?
                 String resourcePath = RequestUtils.getServletPath(request);
 
                 if ("".equals(resourcePath) && null != request.getPathInfo()) {
                     resourcePath = request.getPathInfo();
                 }
               //如果请求的资源以/struts开头,则当作静态资源处里
                 if (serveStatic && resourcePath.startsWith("/struts")) {
                     findStaticResource(resourcePath, findAndCheckResources(resourcePath), request, response);
                 } else {
                 	//否则继续往下传,知道没有filter为止
                     // this is a normal request, let it pass through
                     chain.doFilter(request, response);
                 }
                 // The framework did its job here
                 return;
             }
            //得到存储Action信息的ActionMapping对象
             dispatcher.serviceAction(request, response, servletContext, mapping);
 
         } finally {
             try {
                 ActionContextCleanUp.cleanUp(req);
             } finally {
                 UtilTimerStack.pop(timerKey);
             }
         }
     }
 
NoCacheFilter的源码:

public class NoCacheFilter implements Filter{
 
 	public void destroy() {
 		
 	}
 
 	public void doFilter(ServletRequest req,
 			ServletResponse res, FilterChain chain)
 			throws IOException, ServletException {
 		/*
 		          并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。
 			Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面
 			Cache-Control响应头有两个常用值: no-cache指浏览器不要缓存当前页面;
 			ax-age:xxx指浏览器缓存页面xxx秒。
 		 */
 		HttpServletResponse hres=(HttpServletResponse) res;
 		hres.setDateHeader("Expires",-1);
 		hres.setHeader("Cache-Control","no-cache"); 
 		hres.setHeader("Pragma","no-cache");
 		System.out.println("cache do the before!");
 		chain.doFilter(req, res);
 		System.out.println("cache do the after!");
 	}
 	public void init(FilterConfig config) throws ServletException {	
 	}
 }
执行结果:

before encoding utf-8 filter!
 do action! 
 after encoding utf-8 filter!




分享到:
评论

相关推荐

    Struts2执行流程

    Struts2执行流程 1. web.xml 部署描述符 2. FilterDispatcher 实现StrutsStatics, Filter接口 (1)Filter:一个filter是一个对象用于执行过滤任务为每个请求资源(一个servlet或静态内容),或响应一个资源,或两者.过滤...

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

    tomcat、struts2、servlet Filter(过滤器) 工作原理 学习servlet的好资料,懂得工作原理,更容易理解问题.

    Struts2的工作原理和流程

    2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 接着FilterDispatcher被调用,...

    struts2-1.zip

    MVC模式(model view controller) 模型:封装应用程序的数据和业务逻辑(POJO一个普通的JAVA类) 视图:实现应用程序的信息显示功能(JSP) 控制器:接收来自用户的输入...Struts2中最主要的一个就是过滤器filter

    Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)

    《Java Web整合开发王者归来(JSP+Servlet+Struts+Hibernate+Spring)》全面介绍了Java Web开发中的各种相关技术及知识。全书分为9篇,内容层次清晰,难度循序渐进。第1篇为入门篇,内容包括Java Web开发概述等;第2篇...

    详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用

    下面小编就为大家带来一篇详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    javaWeb_struts2框架实现简单用户注册登录

    基于javaWeb MVC模式,借助struts2框架编写,实现用户简单的注册与登录功能。 1.本demo严格按照MVC的分层模式采用myeclipse编写,可直接运行,...当然需要在web.xml中配置核心filter—strutsPrepareAndExecuteFilter.

    使用struts2拦截器对登陆权限验证

    综合使用servlet filter与struts2 interceptor对权限进行验证。

    struts2开发文档

    struts2的所有知识点 流程 原理 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求; 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个...

    Servlet的MVC实例,类似Struts2

    Servlet写的简单MVC实例,仿Struts2 用Filter搞的简单路由机制,转发action到指定controller的方法进行处理 适合对性能要求较高的项目,如移动应用数据支撑

    struts 2.2 api文档

    org.apache.struts2.dispatcher.ng, org.apache.struts2.dispatcher.ng.filter, org.apache.struts2.dispatcher.ng.listener, org.apache.struts2.dispatcher.ng.servlet, org.apache.struts2.impl, org.apache....

    解决struts2下载异常的jar包 struts2-sunspoter-stream-1.0.jar

    在struts2中使用result里type="stream"的结果类型时,可以实现文件的下载管理,使用时也是比较顺畅,但是当在“下载提示窗口”中点击“取消按钮”时,总是报出“java.lang.IllegalStateException”异常,异常内容...

    Struts课堂笔记.rar--struts2的struts.properties配置文件详解

    The org.apache.struts2.config.Configuration implementation class org.apache.struts2.config.Configuration接口名 struts.configuration.files A list of configuration files automatically loaded by ...

    struts2+hibernate学习示例

    14、Hibernate的过滤器设置,详见 shtest.HibernateFilter.java(这时候要注意在web.xml中的filter设置) 可以拿这个Demo和Struts2_Test比较一下,认真看的话,你会发现很多有用的信息, 至少能够搞清楚Hibernate到底...

    Struts2入门笔记1-4

    之前的 MVC 中,C 就是Servlet,而现在我们使用Filter实现了 C 的功能;并且发现 Filter的功能 &gt; Servlet的功能 ;其实吧 Struts2 的控制实现是Filter

    struts 2.3.4.1 最新英文版API

    org.apache.struts2.dispatcher.ng This package contains a reimagining of the traditional Struts filter dispatchers. org.apache.struts2.dispatcher.ng.filter org.apache.struts2.dispatcher.ng.listener ...

    java中文乱码解决方案

    1. 在struts2里面,最好将所有字符都设成utf-8。 ; charset=UTF-8"%&gt; &lt;%@ page pageEncoding="UTF-8" %&gt;1.1 在jsp页面设定字符编码。这边有必有说明的是如果是jsp+java bean+servlet的方案,中文乱码很好解决,统一设...

    Filter模式-2013-8-9

    Filter模式,这个例子里面介绍了Filter设计模式的方式,模拟了web项目里面的Filter的原理,而且还模拟了struts2里面的设计模式,注释充分。

    SSH的jar包.rar

    一个请求在Struts2框架中的处理大概分为以下几个步骤: 1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选...

    Ajax+Struts1.x 登陆程序源代码(详解)

    用AJAX+STRUTS写的登陆程序,并且附加了超级详尽的源码注释,并且代码分离非常清晰。...总之,就是整个AJAX+STRUTS项目登陆程序打包,可以在ECLIPSE下导入,在TOMCAT5.X下运行(这需要将下载包当中的sql先执行)

Global site tag (gtag.js) - Google Analytics