简单理解Struts2中拦截器与过滤器的区别及执行顺序

合集下载

struts2

struts2

1.strust2框架来历简介:WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。

(同时也是一个成熟的基于Web的MVC框架)MVC:Model View Controller,model是模型,view是视图,controller是控制器,是一种框架模式。

随着WebWork框架的发展,衍生出了strust2框架,因此strust2框架是WebWork的升级,而不是一个全新的框架,因此稳点性、性能等方面都有很好的保证,而且也同时吸收了struts1框架和WebWork俩者的优点.所以strust2框架也是一个基于Web的MVC框架注意:strust2框架并不是struts1框架的延续或者升级,俩者有着很大的不同2.web项目中的三层架构(和MVC是俩个完全不同的架构)1.表示层(Struts2框架就是工作在这个地方)2.业务逻辑层(service层,处理业务逻辑,比如判断用户名是否存在、密码是否正确、权限是否拥有、账号是否被冻结、账号是否异常、用户积分是否到达操作要求等等,多为一些执行某一个操作条件的判断)3.数据访问层(dao层,专门处理和数据库进行交换的事情,jdbc/hibernate就在这里使用)在项目中,这些不同的分层的表现形式,其实就是在我们自己建的不同的package 中写上各自分层中所使用的java类.比如在项目中我们建了三个package,三个package中java类的作用分别为表示层的代码、业务逻辑层代码、数据访问层代码。

注意:可以理解为,MVC架构是这里说描述的三层架构的一部分,即:三层架构中的表示层可以使用mvc架构的框架来实现,例如使用struts2框架.3.使用struts2框架的好处(为什么要使用struts2框架)减少编程人员代码的编写,使代码更加简洁明了,缩短开发时间,增加开发效率.4.struts2框架引入到web项目中首先使用Eclipse/MyEclipse中建一个web项目.1.把struts2相关jar包引入到项目中。

02-Struts2的工作流程及配置文件

02-Struts2的工作流程及配置文件

Struts2的工作流程及配置文件--- ---Struts2.0的流程图从图中看到Struts2的工作流程如下:1.服务器接收到的请求首先经过一组过滤器链(实际中的其他过滤器可能还包括诸如Spring 的字符过滤器CharactorEncodingFilter、V elocity的过滤器等,一般FilterDispatcher位于过滤器的最后一个执行),过滤器链按照你在web.xml中的配置顺序在接收客户请求时顺序执行,在向客户发送响应时反序执行,Struts2的核心FilterDispatcher在web.xml中的配置如下:<filter><filter-name>setCharactor</filter-name><!-- 配置字符过滤--><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter><filter-name>struts2</filter-name><!-- 配置Struts2过滤器--><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter><filter-mapping><filter-name>setCharactor</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>注意:如果你使用的是W ebLogic6.1作为应用服务器,需要使用FilterDispatcherCompatW eblogic61替代FilterDispatcher。

拦截器和过滤器的区别以及AOP概念

拦截器和过滤器的区别以及AOP概念

过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符拦截器,是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

拦截器与过滤器的区别:1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。

2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次执行顺序:过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。

个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程(还没想到要做啥),再向上返回到过滤器的后续操作。

面向切面编程(AOP是Aspect Oriented Program的首字母缩写),我们知道,面向对象的特点是继承、多态和封装。

而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。

实际上也就是说,让不同的类设计不同的方法。

struts2核心工作流程与原理

struts2核心工作流程与原理

struts2核心工作流程与原理做为一名技术人员,听到太多关于.net和java的比较的话题。

我想对那些技术人员说,请先了解一下什么是java(或者.net)吧,其实你根本不了解。

这是Struts2官方站点提供的Struts 2 的整体结构。

一个请求在Struts2框架中的处理大概分为以下几个步骤1.客户端提起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。

2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。

注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher。

3.FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter其代码如下:public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain ) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) res;ServletContext servletContext = filterConfig.getServletContext();// 在这里处理了HttpServletRequest和HttpServletResponse。

Struts2知识点总结

Struts2知识点总结

Struts2基础知识Struts2概述1.Struts2框架应用javaee三层结构中的web层框架。

2.Struts2框架在struts1和webwork基础之上发展的全新框架。

3.Struts2所解决的问题:在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。

图解:4.现在比较稳定的Struts2版本struts-2.3.24-all.zip5.web层常见框架1.struts2.springMVCStruts2框架入门1.导入jar包1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring包,是不能使用的,导入会导致程序不能运行。

2.到app目录里面复制案例的jar包是最好的方法。

2.创建action3.配置action类的访问路径1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的,位置必须在src下面,名称为struts.xml 。

2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即可。

3.action的配置*注意访问路径:http://域名/端口号/项目名/action名.action注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。

4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴即可。

Struts2执行过程图解:Struts2配置1.是一种常量标签2.修改Struts2的默认常量值1.常用方式在struts.xml中进行配置。

2.其它两种方式1.在src下面创建struts.properties文件并修改。

2.在web.xml文件中进行修改。

3.Struts2最常用的常量struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。

Struts2笔记(一)可使用全局页面。

1、配置方法:在package标签下配置2、注意:该标签只能在一个package标签中使用,如果有多个标签,需要重新定义。

spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序

spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序

spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序转自:https:///huxiaodong1994/article/details/829918281. 程序执行的顺序是先进过滤器,再进拦截器,最后进切面。

注意:如果拦截器中preHandle方法返回的为false时,则无法进入切面,例子如下。

@RestController @RequestMapping('/user') public class UserController { @GetMapping('/{id:\\d }') @JsonView(erDetailView.class) public User getInfo(@PathVariable String id) { User user = new User(); user.setUsername('tom'); return user; } }编写方法的过滤器:@Componentpublic class TimeFilter implements Filter {/* (non-Javadoc)* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println('time filter init');}/* (non-Javadoc)* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println('time filter start');long start = new Date().getTime();chain.doFilter(request, response);System.out.println('time filter:' (new Date().getTime() - start));System.out.println('time filter finish');}/* (non-Javadoc)* @see javax.servlet.Filter#destroy()*/@Overridepublic void destroy() {System.out.println('time filter destroy');}}编写方法的拦截器:@Component public class TimeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler) throws Exception { System.out.println('preHandle'); System.out.println(((HandlerMethod)handler).getBean().getClass ().getName());System.out.println(((HandlerMethod)handler).getMethod().getN ame()); request.setAttribute('startTime', new Date().getTime()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println('postHandle'); Long start = (Long)request.getAttribute('startTime'); System.out.println('time interceptor 耗时:' (new Date().getTime() - start)); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println('afterCompletion'); Long start = (Long) request.getAttribute('startTime'); System.out.println('time interceptor 耗时:' (new Date().getTime() - start)); System.out.println('ex is ' ex); } }编写方法的切面:@Aspect@Componentpublic class TimeAspect {@Before('execution(public * erController.*(..))')public Object handlerControllerMethod() throws Throwable {System.out.println('time aspect start');return new Object();}}运行结果:1、当拦截器中preHandle的方法返回为true时:` time filter start preHandle erController$$EnhancerBySpringCGLIB $$b0bb0dcf getInfo time aspect start postHandle time interceptor 耗时:76 afterCompletion time interceptor 耗时:76 ex is null time filter:92 time filter finish time filter start time filter:46 time filter finish2、当拦截器中preHandle的方法返回为false时:time filter startpreHandleerController$$EnhancerBySpringC GLIB$$b0bb0dcfgetInfotime filter:12time filter finishtime filter starttime filter:23time filter finish2. 当程序有异常抛出时,回先进入切面,然后在进入自定义的ControllerAdvice中。

struts2常见面试题

struts2常见面试题

struts2常见面试题Introduction:Struts2是一种用于开发Java Web应用程序的开源Web应用框架。

在软件工程领域,Struts2常常是面试中的热门话题。

本文将介绍一些常见的Struts2面试题,并提供详细解答和示例。

Question 1: 什么是Struts2框架?它的主要特点是什么?Struts2是一个基于MVC设计模式的Web应用框架。

它通过集成多个核心组件(如拦截器、过滤器、表单验证等)提供了一套丰富的功能,用于简化开发和管理Java Web应用程序。

Struts2的主要特点包括:1. 松耦合:Struts2使用基于配置的方式来管理组件之间的依赖关系,降低了模块之间的耦合。

2. 灵活性:开发人员可以根据自己的需求进行扩展和定制,以适应不同的项目需求。

3. 可测试性:Struts2的组件松耦合特点使得单元测试变得容易,并且可以方便地模拟用户请求进行测试。

Question 2: Struts2的核心组件有哪些?Struts2的核心组件包括:1. Action:处理用户请求的核心组件,负责接收请求并执行相应的业务逻辑。

2. Interceptor:用于对请求进行预处理和后处理的拦截器组件。

3. Result:负责生成响应结果,可以是页面视图或其他格式的数据(如JSON、XML等)。

4. FilterDispatcher:负责将请求分发给合适的Action处理。

5. ValueStack:用于存储Action处理的结果数据,支持OGNL表达式以便于数据的访问和操作。

Question 3: 如何定义一个Struts2的Action?在Struts2中,可以通过以下几种方式来定义一个Action:1. 实现Action接口:通过实现Action接口,并提供相应的业务方法来处理请求。

2. 继承ActionSupport类:ActionSupport是一个提供了一些方便方法的抽象类,可以直接继承并实现自己的业务逻辑。

struts2流程以及源码解析

struts2流程以及源码解析

1.1 Struts2请求处理1. 一个请求在Struts2框架中的处理步骤:a) 客户端初始化一个指向Servlet容器的请求;b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(SiteMesh Plugin),主要清理当前线程的ActionContext和Dispatcher;c) 请求经过插件过滤器,如:SiteMesh、etc等过滤器;d) 请求经过核心过滤器FilterDispatcher,执行doFilter方法,在该方法中,询问ActionMapper来决定这个请求是否需要调用某个Action;e) 如果ActionMapper决定需要调用某个Action,则ActionMapper会返回一个ActionMapping实例(存储Action的配置信息),并创建ActionProxy (Action代理)对象,将请求交给代理对象继续处理;f) ActionProxy对象根据ActionMapping和Configuration Manager询问框架的配置文件,找到需要调用的Action类;g) ActionProxy对象创建时,会同时创建一个ActionInvocation的实例;h) ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用;i) 一旦Action执行完毕,ActionInvocation实例负责根据struts.xml中的配置创建并返回Result。

Result通常是一个需要被表示的JSP或者FreeMarker 的模版,也可能是另外的一个Action链;j) 如果要在返回Result之前做些什么,可以实现PreResultListener接口,PreResultListener可以在Interceptor中实现,也可以在Action中实现;k) 根据Result对象信息,生成用户响应信息response,在生成响应过程中可以使用Struts2 框架中继承的标签,在此过程中仍会再次涉及到ActionMapper;2. Struts2请求处理示意图:1.2 Struts2请求处理源码分析当用户向Struts2发送请求时,FilterDispatcher的doFilter()方法自动调用,doFilter()方法处理请求过程,如下:1. 创建值栈对象stack;2. 创建Action上下文对象;3. 对请求进行重新封装,此次封装根据请求内容的类型不同,返回不同的对象:如果为multipart/form-data类型,则返回MultiPartRequestWrapper类型的对象,该对象服务于文件上传,否则返回StrutsRequestWrapper类型的对象,MultiPartRequestWrapper是StrutsRequestWrapper的子类,而这两个类都是HttpServletRequest接口的实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4)doFilter(ServletRequest request, ServeltResponse response, FilterChain chain):处理一个action或处理一个请求的静态内容。
(5)findInputStream(String name, String packagePrefix):搜索类路径下的静态资源。
Debugging Interceptor
debugging
提供不同的调试用的页面来展现内部的数据状况。
Execute and Wait Interceptor
execAndWait
在后台执行Action,同时将用户带到一个中间的等待页面。
Exception Interceptor
exception
(12)setMapper(ActionMapper actionMapper)
(13)setEncoding(String val)
(14)setServeStaticContent(String val)
(15)setServeStaticBrowserCache(String val)
附:
Struts2(XWork)提供的拦截器的功能说明:
需注意的是:他会暴露一些比较敏感的信息例如,properites文件中的数据库连接信息。
注:过滤器支持以下初始参数:
config -被调入的逗号隔开的XML文件列表。
actionPackages -被actions扫描的逗号隔开的packages列表。
configProviders -逗号分隔的实现了ConfigurationProvider接口(建造Configuration时被使用)的实现类。
(10)parse(String packages):返回一个数组通过解析一个指定逗号分隔的packages列表。
(11)prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response):对给定的request对象进行封装返回一个封装HttpServletRequest对象。例如显示的处理multipart数据。
拦截器
名字
说明
Alias Interceptor
alias
在不同请求之间将请求参数在不同名字件转换,请求内容不变
Chaining Interceptor
chain
让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。
(8)getFilterConfig():获取FilterConfig实例。
(9)getServletContext():给WebLogic的一些版本提供一个工作区。
(9)init(FilterConfig filterCongfig):创建默认的dispatcher对象和设置静态资源的默认包信息来初始化filter。
(2)createDispatcher(FilterConfig filterConfig):创建默认的dispatcher对象,如果需要的话,子类可以重载此方法,自定义一个dispatcher对象。
(3)destory():调用dispatcher.cleanup(),依次释放本地线程,销毁dispatcher对象。
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
Servlet Config Interceptor
servletConfig
提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。
Static Parameters Interceptor
staticParams
从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。
f) Result类型可以是jsp或者freeMark等
g)这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
h)响应的返回是通过我们在web.xml中配置的过滤器
i)如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。
1,Eclipse安装spket插件。(两种方式):
(2)清除ActionContext
过滤器为了确保内存溢出,会自动的清除ActionContext。这可能会存在一些问题,在和其它的框架集成时,例如SiteMesh。ActionContextCleanUp提供了怎么处理这些问题的一些信息。
(3)维护静态内容
过滤器也会维护在Struts2中使用的一些公共的静态的内容,例如JavaScript文件,CSS文件等。搜索/struts/*范围内的请求,然后将/struts/后面的值映射到一些struts的公共包中,也可以在你的类路径中搜索。默认情况下会去查找以下包:org.apache.struts2.static.template。这样你只用请求/struts/xhtml/styles.css,XHTML UI主题默认的样式表将会被返回。同样,AJAX UI组件需要的JavaScript文件,也可以在org.apache.struts2.static包中被找到。如果你想加入其它被搜索的包,在web.xml中设置filter时,通过给"actionPackages"初始参数一个逗号隔开的包列表值来设定。
org.apache.struts2.dispatcher.FilterDispatcher的四个功能
org.apache.struts2.dispatcher.FilterDispatcher是Struts2的主要的Filter,负责四个方面的功能:
(1)执行Actions
(2)清除ActionContext
Model Driven Interceptor
model-driven
如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。
Scoped Model Driven
scoped-model-driven
如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。
将异常定位到一个画面
File Upload Interceptor
fileUpload
提供文件上传功能
I18n Interceptor
i18n
记录用户选择的locale
Logger Interceptor
logger
输出Action的名字
Message Store Interceptor
store
存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。
Roles Interceptor
roles
确定用户是否具有JAAS指定的Role,否则不予执行。
查看图片附件
10:41
评论/浏览(0 / 762)
分类:企业架构
2010-07-29
缩略显示
Eclipse支持jQuery自动提示
博客分类:
jQuery
感谢:/blog/458372
简单理解Struts2中拦截器与过滤器的区别及执行顺序
当接收到一个httprequest ,
a)当外部的httpservletrequest到来时
b)初始到了servlet容器传递给一个标准的过滤器链
c) FilterDispatecher会去查找相应的ActionMapper,如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy
Parameters Interceptor
params
将请求中的参数设置到Action中去。
Prepare Interceptor
prepare
如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。
Scope Interceptor
scope
将Action状态存入session和application的简单方法。
(4)filterConfig:通过初始参数,提供一个FilterConfig实例。
(5)lastModifiedCal:在缓存静态content,提供一个格化的日期用于设定头信息。
(6)log:提供一个logging实例。
(7)patchPrefixs:存储静态资源的路径前缀信息。
(8)serveStatic:存储StrutsConstants.STRUTS_SERVE_STATIC_CONTENT的设置。
Conversion Error Interceptor
conversionError
将错误从ActionContext中添加到Action的属性字段中。
Create Session Interceptor
createSession
自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。
相关文档
最新文档