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包引入到项目中。

struts的过滤器

struts的过滤器

配置web.xml,配置Struts2的过滤器配置web.xml,配置Struts2的过滤器,例如:<include…/>是<struts>标签的一个子标签,它可以把其他配置文件导入进来,从而实现Struts2的模块化。

它的“file”属性定义了要导入的文件的名称——该文件要和“struts.xml”一样有着相同的结构。

在大型项目开发中,可以将项目分解为多个小模块,每个模块独立开发和管理。

我们可以为每个模块提供一个配置文件,然后对其进行配置,然后在struts.xml中使用include元素包<include file="struts-chat.xml"/><include file="struts-hangman.xml"/><include file="struts-continuations.xml"/><include file="struts-tags.xml"/><include file="struts-validation.xml"/>含这些配置文件。

例如:当我们导入文件时,一定要注意导入的顺序。

因为从文件被导入的那个点开始,该文件中的信息才能被访问到,也就是说,如果要使用另外一个文件中所定义的标签,那么该文件就必须要在被引用之前就配置好。

Bean的两种配置方法1)框架的IoC容器创建bean的实例,然后将该实例注入到框架的内部对象中。

第一种做法可以称为对象注入,它通常要用到bean的type属性,告诉容器这个对象实现了哪个接口,如果自己创建了ObjectFactory,则可以在struts-default.xml中作如下配置:。

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标签中使用,如果有多个标签,需要重新定义。

struts2-2(拦截器)

struts2-2(拦截器)

17
18
• validation拦截器
– 调用验证框架进行数据验证
• workflow拦截器
– 调用Action类的validate(),执行编码验证
11
Struts 2默认拦截器栈
• struts-default.xml中定义一个defaultStack拦截器栈,并将其指 定为默认拦截器 • 只要在定义包的过程中继承struts-default包,那么defaultStac k将是默认的拦截器
• 8、Action执行完毕,ActionInvocation负责根据结果码字符 串在struts.xml的配置中找到对应的返回结果 • 9、拦截器被再次执行
• 10、过滤器被再次执行
4
Struts 2核心接口和类
• ActionMapper
– 根据请求的URI查找是否存在对应Action调用
• ActionMapping
10
Struts 2自带拦截器
• Params拦截器
– 负责将请求参数设置为Action属性
• servletConfig拦截器
– 将源于Servlet API的各种对象注入到Action
• fileUpload拦截器
– 对文件上传提供支持
• exception拦截器
– 捕获异常,并且将异常映射到用户自定义的错误页面
12
配置拦截器
<package name="packName" extends="struts-default" namespace="/manage"> <interceptors> <!-- 定义拦截器 --> <interceptor name="interceptorName" class="interceptorClass" /> <!-- 定义拦截器栈 --> <interceptor-stack name="interceptorStackName"> <!--指定引用的拦截器--> <interceptor-ref name="interceptorName|interceptorStackName" /> </interceptor-stack> </interceptors> <!--定义默认的拦截器引用--> <default-interceptor-ref name="interceptorName|interceptorStackName" /> <action name="actionName" class="actionClass"> <!—为Action指定拦截器引用--> <interceptor-ref name="interceptorName|interceptorStackName" /> <!--省略其他配置--> </action> </package>

Struts2的拦截器配置

Struts2的拦截器配置

拦截器实例
public class SimpleInterceptor extends AbstractInterceptor { private String name; public void setName(String name) { = name; } public String intercept(ActionInvocation invocation) throws Exception { LoginAction action = (LoginAction)invocation.getAction(); ......... String result = invocation.invoke(); ...... return result; } }
Struts 专题篇
第九章 Struts 2 的拦截器 主讲:陈宝峰
内容描述
● ● ● ● ● ●
拦截器概述 拦截器配置 使用拦截器的配置 使用默认拦截器的配置 拦截器实例 方法过滤
拦截器概述
● ●
拦截器是 Struts 2 中的重要组成部分 大量的内建拦截器完成了大部分的 Struts2 框架的工作
结束
使用默认拦截器的配置
<package name=” 包名” > <interceptors> <interceptor name=” 拦截器名 1” class=”......” /> ...... <interceptor-stack name=” 拦截器栈名 1”> <interceptor-ref name=” 拦截器名 1” /> ...... </interceptor-stack> </interceptors> <default-interceptor-ref name=” 拦截器名或拦截器栈名” /> <action ...... /> </package>

struts2拦截器拦截指定方法

struts2拦截器拦截指定方法

import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/**拦截指定方法*/public class MyFilterInterceptor extends MethodFilterInterceptor{private static final long serialVersionUID = 1L;private String name;public void setName(String name){ = name;}@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception { //取得请求相关的ActionContext实例ActionContext ctx = invocation.getInvocationContext();Map session = ctx.getSession();//取出名为user的Session属性String user = (String)session.get("user");//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆if (user != null && user.equals("scott") ){return invocation.invoke();}//没有登陆,将服务器提示设置成一个HttpServletRequest属性ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");//直接返回login的逻辑视图return Action.LOGIN;}}2.struts.xml配置<package name="site" extends="struts-default" namespace="/site"><interceptors><!-- 定义了一个名为authority的拦截器--><interceptor name="authority" class="cn.zgcyx.filter.MyFilterInterceptor"/> <!--上面自定义的拦截器类--><interceptor-stack name="myDefault"><interceptor-ref name="authority"> <!-- 引用拦截器--><param name="includeMethods">getALL,getPart,listUser</param> <!-- 设置需要拦截的方法,多个以逗号隔开--></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><default-interceptor-ref name="myDefault"></default-interceptor-ref><!-- 全局--><global-results><!-- 当返回login视图名时,转入/login.jsp页面--><result name="login">/login.jsp</result></global-results><action name="site" class="siteServiceAction"><!--省略跳转--></action></package>。

Struts2知识点详解

Struts2知识点详解

Struts 2的基本流程Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。

在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。

2.核心控制器:FilterDispatcherFilterDispatcher是Struts 2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。

如果用户请求以action结尾,该请求将被转入Struts 2框架处理。

Struts 2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts 2调用名为login的Action来处理该请求。

Struts 2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action时,定义了该Action的name属性和class属性,其中name属性决定了该Action处理哪个用户请求,而class属性决定了该Action的实现类。

Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。

而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。

显然,上面的处理过程是典型的AOP(面向切面编程)处理方式。

图3.19显示了这种处理模型。

图3.19 Struts 2的拦截器和Action从图3.19中可以看出,用户实现的Action类仅仅是Struts 2的Action代理的代理目标。

11_Struts 2 拦截器

11_Struts 2 拦截器
Struts 2 拦截器
主要内容
拦截器概述 自定义拦截器 系统拦截器解读 拦截器原理
拦截器概述
拦截器(Intercepter)就是当一个Action被执行之前与执 行之后的一段代码。 许多框架(framework)的核心功能就是通过拦截器实现的 。比如Struts 2 中的数据校验,类型转换,文件上传, 国际化,数据重复提交等。 拦截器是可插拔的,需要时插入,不需要时拔出。 可以为每个Action配置拦截器,也可以根据业务需求编写 自己的拦截器。
拦截器思想
面向方面的编程(AOP) 把通用的功能从系统中提出来,单独处理,实现了软件的 重用。
课堂作业
使用拦截器权限验证 提示: invocation.getInvocationConte截器
实现com.opensymphony.xwork2.interceptor.Interceptor接口 映射拦截器 使用拦截器栈管理拦截器 使用默认拦截器
自定义拦截器
继承 com.opensymphony.xwork2.interceptor.AbstractInterc eptor抽象类实现拦截器
拦截器的参数
可以在定义拦截器时设置参数,也可以在拦截器栈中设置 参数。
系统拦截器与栈
在struts-default.xml 文件中列出了Struts 2中定义的 所有拦截器,与拦截器栈。 timer拦截器
拦截器与过滤器的区别
拦截器是基于JAVA反射机制的,而过滤器不是 过滤器依赖于servlet容器,而拦截器不依赖 拦截器只能对Action起作用,而过滤器则可以对几乎所有 请求 拦截器可以访问Action上下文,值栈中的对象,而过滤器 不能。

java开发框架面试题整理

java开发框架面试题整理

Java开发框架面试Struts2热点面试题?1. 简述Struts2 的工作流程:①. 请求发送给StrutsPrepareAndExecuteFilter②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个Struts2 请求③. 若该请求是一个Struts2 请求,则StrutsPrepareAndExecuteFilter 把请求的处理交给ActionProxy④. ActionProxy 创建一个ActionInvocation 的实例,并进行初始化⑤. ActionInvocation 实例在调用Action 的过程前后,涉及到相关拦截器(Intercepter)的调用。

⑥. Action 执行完毕,ActionInvocation 负责根据struts.xml 中的配置找到对应的返回结果。

调用结果的execute 方法,渲染结果。

⑦. 执行各个拦截器invocation.invoke() 之后的代码⑧. 把结果发送到客户端2. Struts2 拦截器和过滤器的区别:①、过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。

②、Struts2 拦截器只能对Action 请求起作用,而过滤器则可以对几乎所有请求起作用。

③、拦截器可以访问Action 上下文(ActionContext)、值栈里的对象(ValueStack),而过滤器不能.④、在Action 的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

3. 为什么要使用Struts2 & Struts2 的优点:①. 基于MVC 架构,框架结构清晰。

②. 使用OGNL: OGNL 可以快捷的访问值栈中的数据、调用值栈中对象的方法③. 拦截器: Struts2 的拦截器是一个Action 级别的AOP, Struts2 中的许多特性都是通过拦截器来实现的, 例如异常处理,文件上传,验证等。

java 过滤器、监听器 拦截器 原理个人总结

java 过滤器、监听器 拦截器 原理个人总结

过滤器创建一个Filter 只需两个步骤:(1)创建Filter 处理类:(2)在web.xml 文件中配置Filter 。

创建Filter 必须实现javax.servlet.Filter 接口,在该接口中定义了三个方法。

• void init(FilterConfig config): 用于完成Filter 的初始化。

• void destroy(): 用于Filter 销毁前,完成某些资源的回收。

• 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中。

一、理解Struts2拦截器1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.2. 拦截器栈(Interceptor Stack)。

Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。

二、实现Struts2拦截器原理Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器三、定义Struts2拦截器。

Struts2知识点总结

Struts2知识点总结

1.struts2 步骤1.创建web项目2.添加struts2的必须jar包3.添加支持(配置web.xml文件)4.创建界面和相应的action5.配置struts.xml文件6.部署运行项目2.struts2的工作流程1. 浏览器发送一个请求。

2. 核心控制器FilterDispatcher根据请求决定调用合适的Action。

3. 拦截器(Intercepter)自动对请求应用通用功能,如验证等。

4. 回调Action的execute方法,该execute方法根据请求的参数来执行一定的操作。

5. Action的execute方法处理结果信息将被输出到浏览器中,支持多种形式的视图。

3.struts2的配置文件1.web.xml2.struts.xml(核心管理Action映射) 自己配置的3.struts-default.xml是struts2框架默认加载的配置文件。

它定义struts2一些核心的bean和拦截器。

这些拦截器是以key-value对的形式配置在struts-default.xml中,其中name是拦截器名字,就是后面使用该拦截器的引用点,value则指定拦截器的实现类。

4.struts.properties(核心管理属性) 自己配置的5.default.properties(核心管理属性)4.<struts>标签下的子标签配置1.<bean type="com.opensymphony.xwork2.ObjectFactory" name="struts"class="org.apache.struts2.impl.StrutsObjectFactory" />2.<include file="struts1.xml"></include>3.<constant name=“key” value=“value” />4.<package></package>5.package标签下的配置1.<action name="loginAction" class="com.action.loginAction"><result name="success">/welcome.jsp</result><result name="error">/index.jsp</result></action>2.<global-results><result></result></global-results>3.<global-exception-mappings><exception-mapping result="error"exception="java.long.Exception"></exception-mapping></global-exception-mappings>……………………………………6.action类实现Action接口和继承ActionSupport7.通过ActionContext类获得context(request),再通过context获得session和application context.put("key","value");session.put("key","value");session.put("key","value");public class ServletActionContext (org.apache.struts2)public static PageContext getPageContext()public static HttpServletRequest getRequest()public static HttpServletResponse getResponse()public static ServletContext getServletContext()8.在action中直接使用一个对象,两种方式:1.在提交表单时name属性为:对象.xxxx2.实现ModelDriven<类类型>接口和其方法。

SpringBoot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解

SpringBoot使用过滤器和拦截器分别实现REST接口简易安全认证示例代码详解

SpringBoot使⽤过滤器和拦截器分别实现REST接⼝简易安全认证⽰例代码详解本⽂通过⼀个简易安全认证⽰例的开发实践,理解过滤器和拦截器的⼯作原理。

很多⽂章都将过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)这三者和Spring关联起来讲解,并认为过滤器(Filter)、拦截器(Interceptor)和监听器(Listener)是Spring提供的应⽤⼴泛的组件功能。

但是严格来说,过滤器和监听器属于Servlet范畴的API,和Spring没什么关系。

因为过滤器继承⾃javax.servlet.Filter接⼝,监听器继承⾃javax.servlet.ServletContextListener接⼝,只有拦截器继承的是org.springframework.web.servlet.HandlerInterceptor接⼝。

上⾯的流程图参考⾃⽹上资料,⼀图胜千⾔。

看完本⽂以后,将对过滤器和拦截器的调⽤过程会有更深刻理解。

⼀、安全认证设计思路有时候内外⽹调⽤API,对安全性的要求不⼀样,很多情况下外⽹调⽤API的种种限制在内⽹根本没有必要,但是⽹关部署的时候,可能因为成本和复杂度等问题,内外⽹要调⽤的API会部署在⼀起。

实现REST接⼝的安全性,可以通过成熟框架如Spring Security或者 shiro 搞定。

但是因为安全框架往往实现复杂(我数了下Spring Security,洋洋洒洒⼤概有11个核⼼模块,shiro的源码代码量也⽐较惊⼈)同时可能要引⼊复杂配置(能不能让⼈痛快⼀点),不利于中⼩团队的灵活快速开发、部署及问题排查。

很多团队⾃⼰造轮⼦实现安全认证,本⽂这个简易认证⽰例参考⾃我所在的前⼚开发团队,可以认为是个基于token的安全认证服务。

⼤致设计思路如下:1、⾃定义http请求头,每次调⽤API都在请求头⾥传⼈⼀个token值2、token放在缓存(如redis)中,根据业务和API的不同设置不同策略的过期时间3、token可以设置⽩名单和⿊名单,可以限制API调⽤频率,便于开发和测试,便于紧急处理异状,甚⾄临时关闭API4、外⽹调⽤必须传⼈token,token可以和⽤户有关系,⽐如每次打开页⾯或者登录⽣成token写⼊请求头,页⾯验证cookie和token有效性等在Spring Security框架⾥有两个概念,即认证和授权,认证指可以访问系统的⽤户,⽽授权则是⽤户可以访问的资源。

通过实例跟我学Struts2从入门到精通——如何应用Struts2中的“上传文件拦截器”限制上传文件的类型和大小

通过实例跟我学Struts2从入门到精通——如何应用Struts2中的“上传文件拦截器”限制上传文件的类型和大小

1.1通过代码实例跟我学Struts2框架从入门到精通——如何应用Struts2框架中的“上传文件拦截器”限制上传文件的类型和大小的应用实例1.1.1应用Struts2框架中的“上传文件拦截器”限制上传文件的类型和大小上述例子尽管是实现图片上传的功能,但用户实际可以上传任何类型的文件。

如果在应用中需要限制上传文件的类型,应该怎么实现呢?比如,只能够上传图片类型的文件。

1、首先修改upLoadProductImage.jsp页面在<body>与<s:form>之间加入“<s:fielderror />”,用于在页面上输出错误信息。

同时添加<%@ taglib prefix="s" uri="/struts-tags"%>标签的引用。

2、然后修改struts.xml文件,将UpLoadProductImageAction的定义改为如下所示<action name="upLoadProductImageAction"class="com.px1987.sshwebcrm.action.UpLoadProductImageAction"><interceptor-ref name ="fileUpload"><param name ="allowedTypes" >image/bmp,image/png,image/x-png,image/gif,image/pjpeg,image/jp eg</param><param name="maximumSize">5000000</param></interceptor-ref><interceptor-ref name ="defaultStack" /><param name="savePath">/uploadImages</param><result>/productManage/showUploadInfo.jsp</result><result name="input">/productManage/upLoadProductImage.jsp</result> </action>或者<interceptor-ref name="basicStack"/> 。

Struts2-interceptor

Struts2-interceptor

Struts2拦截器一、什么是拦截器?1、拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。

它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。

同时也是提供了一种可以提取action 中可重用的部分的方式。

2、拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。

拦截器链就是将拦截器按一定的顺序联结成一条链。

在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

3、如何使用struts2拦截器,或者自定义拦截器。

特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):<interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/>(必须加,否则出错)4、也可以改为对全局Action设置自己需要的拦截器,如下:在struts.xml里面定义全局的配置设置<package name="struts-shop" extends="struts-default"><interceptors><interceptor-stack name="myStack"><interceptor-ref name="checkbox"><param name="uncheckedValue">0</param></interceptor-ref><interceptor-ref name="defaultStack"/></interceptor-stack></interceptors><default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)</package>struts-action.xml里面配置Action如下:<package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)<action name="logon" class="logonAction"><result>/jsp/smeishop/admin/index.jsp</result> <resul t name="error">/jsp/smeishop/admin/logon.jsp</result><result name="input">/jsp/smeishop/admin/logon.jsp</result> </action><action name="logout" class="logoutAction"><result>/jsp/smeishop/admin/logon.jsp</result></action></package>二、Struts2自带的配置及其拦截器配置1、Struts2 拦截器 [Interceptor]拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

struts核心过滤器FilterDispatcher介绍

struts核心过滤器FilterDispatcher介绍

struts核心过滤器FilterDispatcher介绍FilterDispatcher功能介绍FilterDispatcher是struts2的核心控制类负责处理最初的请求分发.四大责任1.执行action2.清空ActionContext上下文3.服务静态的内容(初始化环境等)4.中断请求生命周期中的XWORKS拦截器.FilterDispatcher必须映射所有的请求,除非你只想在某一部分支持struts2的功能.配置filter的url-pattern的时候请使用"/*";1.执行action过滤器根据请求的url判断是否需要调用action(判断的依据是根据actionMapper)如果需要执行action那么处于过滤器链中的其他过滤器将终止,并且调用action.这意味着其他一些一定要执行的过滤器必须放在FilterDispatcher前面.以保证他们的执行.2.清空ActionContext上下文FilterDispatcher讲自动的清除上下文,确保没有内存泄露.但是有时候将导致在集成其他产品时出现某些问题.详情,请看ActionContextUp类3.服务静态的内容FilterDispatcher同时会加载常用的静态内容,例如javascript文件,css文件. FilterDispatcher会查找/struts/*这个目录,并且映射"/struts/"后面的的所有常用的包.以下是默认搜索的包org.apache.struts2.statictemplate例如用户可以通过请求/struts/xhtml/styles.css得到struts2的内置的XHTML UI 主题包下面的默认样式表用户还可以通过为filterDispatcher添加packages参数来添加用户自己的包. FilterDispatcher支持以下初始化参数参数名config 参数值以逗号隔开的配置文件名的列表参数名actionPackages 参数值以逗号隔开的java包名,主要用来扫描检测action参数名configProviders 参数值以逗号隔开的配置提供程序的类名.其他的参数名将被当作是框架的常量.public class FilterDispatcher implementsorg.apache.struts2.StrutsStatics,javax.servlet.Filterorg.apache.struts2.StrutsStatics定义了以下常量这些常量用来获取或者设置请求上下文的对象例如通过ActionContext对象和HTTP_REQUEST我们可以获取或者设置HttpServletRequest对象ActionContext.getContext().put(HTTP_REQUEST,request);HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(HTTP_REQUEST);public interface StrutsStatics{public static final String HTTP_REQUEST ="com.opensymphony.xwork2.dispatcher.HttpServletRequest";public static final String HTTP_RESPONSE ="com.opensymphony.xwork2.dispatcher.HttpServletResponse";public static final String SERVLET_DISPATCHER ="com.opensymphony.xwork2.dispatcher.ServletDispatcher";public static final String SERVLET_CONTEXT ="com.opensymphony.xwork2.dispatcher.ServletContext";public static final String PAGE_CONTEXT ="com.opensymphony.xwork2.dispatcher.PageContext";public static final String STRUTS_PORTLET_CONTEXT = "struts.portlet.context"; }import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .URLDecoder;import java.util.ArrayList;import java.util.Calendar;import java.util.Enumeration;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.StringT okenizer;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.logging.Log;import mons.logging.LogFactory;import org.apache.struts2.RequestUtils;import org.apache.struts2.StrutsConstants;import org.apache.struts2.StrutsStatics;import org.apache.struts2.dispatcher.mapper.ActionMapper;import org.apache.struts2.dispatcher.mapper.ActionMapping;import com.opensymphony.xwork2.inject.Inject;import com.opensymphony.xwork2.util.ClassLoaderUtil;import com.opensymphony.xwork2.util.profiling.UtilTimerStack;import com.opensymphony.xwork2.ActionContext;public class FilterDispatcher implementsorg.apache.struts2.StrutsStatics,javax.servlet.Filter{//日志类private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);//路径前缀private String[] pathPrefixes;//为缓存静态内容时设置响应头信息提供日期格式化.private final Calendar lastModifiedCal = Calendar.getInstance();//存储StrutConstants.STRUTS_SERVE_STATIC_CONTENT 的设置,该设置可以通过配置文件设置private static boolean serveStatic;//存储StrutConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE的设置,该设置可以通过配置文件设置.private static boolean serveStaticBrowserCache;//存储字符编码的字符串,该设置可以通过配置文件设置private static String encoding;//通过注入方式提供,ActionMapper的实例private static ActionMapper actionMapper;//FilterConfig过滤器配置类的实例,在init方法中初始化private FilterConfig filterConfig;//为子类暴露Dispatcher对象protected Dispatcher dispatcher;/**初始化过滤器的方法,该方法中创建了一个默认的dispatcher,并且在此方法中设置了静态资源的默认包*/public void init(FilterConfig filterConfig)throws ServletException{this.filterConfig = filterConfig;dispatcher = createDispatcher(filterConfig);dispatcher.init();String param = fitlerConfig.getInitParamter("pagckages");String packages = "org.apache.struts2.static templateorg.apache.struts2.interceptor.debugging";if(param != null){packages = param + " "+packages;}this.pathPrefixes = parse(packages);}/**当应用被终止时调用destroy方法,该方法用来用来释放本地线程和任何的DispatcherListeners**/public void destroy(){if(dispatcher==null){LOG.warn("something is seriously wrong,Dispatcher is not initialized(null)");}else{dispatcher.cleanup();}}/**创建默认的Dispatcher对象.可以通过重写此方法提供用户自定义的Dispatcher */protected Dispatcher createDispatcher(FilterConfig filterConfig){Map<String,String> params = new HashMap<String,String>();for(Enumeration e = fitlerConfig.getIntParameterNames();e.hasMoreElements();) {String e.nextElement();String value = filterConfig.getInitParameter(name);params.put(name,value);}return new Dispatcher(filterConfig.getServletContext(),params);}@Inject(StrutsConstants.STRUTS_SERVE_STATIC_CONTENT)public static void setServeStaticContent(String val){serveStatic = "true".equals(val);}@Inject(StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE) public static void setServeStaticBrowserCache(String val) {serveStaticBrowserCache = "true".equals(val);}@Inject(StrutsConstants.STRUTS_I18N_ENCODING)public static void setEncoding(String val) {encoding = val;}@Injectpublic static void setActionMapper(ActionMapper mapper) {actionMapper = mapper;}/**某些版本的webLogic只能通过fitler config 返回servlet context对象,该方法解决了这个问题.**/protected ServletContext getServletContext() {return filterConfig.getServletContext();}protected FilterConfig getFilterConfig() {return filterConfig;}/**包装request对象,如果需要的话也可以根据给定的RQUEST用来处理多媒体类型*/protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request,HttpServletResponse response)throws ServletException{Dispatcher du = Dispatcher.getInstance();//如果cleanUp filter 还没有准备好,程序将准备并且包装请求对象.//cleanup 过滤器必须配置在dispatcher filter对象的前面,因此当cleanup filter对象运行的时候,静态的dispatcher对象必须是nullif(du == null){Dispatcher.setInstance(dispatcher);dispatcher.prepare(request,response);}else{dispatcher = du;}try{request = dispatcher.wrapRequest(request,getServletContext());}catch(IOException e){String message = "Could not wrap servlet request with MultipartRequestWrapper!";LOG.error(message,e);throw new ServletException(message,e);}return request;}protected String[] parse(String packages){if(packages == null){return null;}List<String> pathPrefixes = new ArrayList<String>();StringT okenizer st = new StringT okenizer(packeages,", \n\t");while(st.hasMoreT okens()){String pathPrefix = st.nextToken.replace('.','/');if(!pathPrefix.endsWith("/")){pathPrefix+="/";}pathPrefixes.add(pathPrefix);}return pathPrefixes.toArray(new String[pathPrefixes.size()]);}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{mapping = actionMapper.getMapping(request,dispatcher.getConfigurationManager());}catch(Exception ex){LOG.error("error getting ActionMapping",ex);dispatcher.sendError(request,response,servletContext,HttpServletResponse.SC_INTER NAL_SERVER_ERROR,ex);return;}if(mapping==null){//没有action被请求,是否查找静态资源String resourcePath = RequestUtils.getServletPath(request);if("".equals(resourcePath) && null != request.getPathInfo()){resourcePath = request.getPathInfo();}if(serveStatic && resourcePath.startsWith("/struts")){String /struts".length());findStaticResource(name,request,response);}else{chain.doFilter(request,response);}return;}dispatcher.serviceAction(request,response,servletContext,mapping);}finally{try{ActionContextCleanUp.cleanUp(req);}finally{UtilTimerStack.pop(timerKey);}}}protected void findStaticResource(String name,HttpServletRequest request,HttpServletResponse response)throws IOException{if(!name.endWith(".class")){for(String pathPrefix : pathPrefixes){InputStream is = findInputStream(name,pathPrefix);if(is !=null){Calendar cal = Calendar.getInstance();long ifModifiedSince = 0 ;try{ifModifiedSince = request.getDateHeader("If-Modified-Since");}catch(Exception e){LOG.warn("invalid If-Modified-Since header value:'"+request.getHeader("If-Modified-Since")+"', ignoring");}long lastModifiedMillis = lastModifiedCal.getTimeInMillis();long now = cal.getTimeMillis();cal.add(Calendar.DAY_OF_MONTH,1);long expires = cal.getTimeInMillis();if(ifModifiedSince >0 && ifModiifedSince <= lastModifiedMillis){response.setDateHeader("Expires",expires);response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);is.close();return;}//设置content-typeString contentType = getContentType(name);if(contentType != null){response.setContentType(contentType);}if(serveStaticBrowserCache){response.setDateHeader("Date",now);response.setDateHeader("Expires",expires);response.setDateHeader("Retry-After",expires);response.setHeader("Cache-Control","public");response.setDateHeader("Last-Modified",lastModifiedMillis);}else{response.setHeader("Cache-Control","no-cache");response.setHeader("Pragma","no-cache");response.setHeader("Expires","-1");}try{copy(is,response.getOutputStream());}finally{is.close();}return;}}}response.sendError(HttpServletResponse.SC_NOT_FOUND); }protected String getContentType(String name){if (name.endsWith(".js")){return "text/javascript";}else if (name.endsWith(".css")){return "text/css";}else if (name.endsWith(".html")){return "text/html";}else if (name.endsWith(".txt")){return "text/plain";}else if (name.endsWith(".gif")){return "image/gif";}else if (name.endsWith(".jpg") || name.endsWith(".jpeg")){return "image/jpeg";} else if (name.endsWith(".png")){return "image/png";} else{return null;}}protected void copy(InputStream input, OutputStream output) throws IOException {final byte[] buffer = new byte[4096];int n;while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);}output.flush(); // WW-1526}protected InputStream findInputStream(String name, String packagePrefix) throws IOException{String resourcePath;if (packagePrefix.endsWith("/") && name.startsWith("/")){resourcePath = packagePrefix + name.substring(1);} else{resourcePath = packagePrefix + name;}resourcePath = URLDecoder.decode(resourcePath, encoding);return ClassLoaderUtil.getResourceAsStream(resourcePath, getClass());}}。

struts2基本学习教学

struts2基本学习教学

继续框架的学习:Struts2:MVC ←→SpringMVC (不要打架)Oracle:DB ←→MySQL (一些语法还是有差异的,不要打架) Hiberante:DAO ←→MyBatis (都是实现持久化的,不要打架)SSH整合的一个简单的CRUD案例!SSH: spring struts2 hibernate1,Struts2框架是一个MVC框架M(javabean) V(view) C(前端(核心)控制器,业务控制器)2,阐述Struts2的框架原理请求到达前端(核心)控制器从ActionMapper对象中查找ActionMapping对象获得ActionInvoker对象并执行Action返回视图3,在编写Struts2代码之前再介绍一个框架(了解)Struts2是Struts1的一个”延伸”(其实两个框架没有关系)其实Struts2的前身并不是struts1,它其实来自另一框架:webworkStruts1这个框架的控制器是Servlet,这个框架与servlet是严重耦合的!(ActionServlet)Struts1中的控制器是单例的!Struts2跟Servlet无关!Struts2中的控制器是多例的!4,开发Struts2的项目(学框架就是用别人的东西,学别人定义的规则)1)引入JAR包commons-fileupload-*.*.jar : 实现文件上传commons-logging-*.*.jar : apache下提供的一个日志包freemarker-*.*.jar : 提供视图解析的ognl-*.*.jar: struts2中的一个新特性,提供对象图导航语言struts2-core-*.*.jar :struts2的核心包xwork-core-*.*.jar : webwork的核心包2)在开发之前介绍几个文件:在struts2-core-*.*.jar中文件:struts-default.xml满足约束:文件中定义了组件:<bean> : 是struts2中要使用的bean对象<result-type> : 定义了struts2中视图的响应方式<interceptor>: 定义拦截器在struts2-core-*.*.jar中的org.apache.struts2包中文件:default.properties文件中定义开发的语言环境以及url的默认扩展名3)开发31)配置核心控制器(是一个过滤器) 在web.xmlorg.apache.struts2.dispatcher.FilterDispatcher (过时)org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter (使用)32)View –> JSP编写自己的配置文件:在src下struts.xml满足33)编写ActionAction可以是一个普通的javabean,不需要实现任何接口或者继承任何类!(当然也可以去实现Action接口或者继承ActionSupport类)视图传值给Action:规则是视图组件的name必须和action中的属性名保持一致!!(注:方法的执行顺序Setter –> execute)5,如果在Action中要使用request,response,session,application对象,struts2框架提供了如下机制:去实现XxxAware接口6,如果在struts.xml中希望有多个action的name相同,可以使用不同package进行管理。

拦截器(Interceptor)与过滤器(Filter)

拦截器(Interceptor)与过滤器(Filter)

拦截器(Interceptor)与过滤器(Filter)⽬录⼀、⽤户的普通Http请求执⾏顺序⼆、过滤器、拦截器添加后的执⾏顺序三、拦截器(Interceptor)的基本定义 拦截器是⾯向切⾯(AOP)编程中应⽤的⼀种统⼀处理⽅案,就是在你的Controller、Servie或者⼀个Method调⽤⼀个Method,或者在Method调⽤⼀个Method之后,统⼀的进⾏处理的⽅案,基于Java的反射机制。

拦截器,在AOP(Aspect-Oriented Programming)中可以⽤于在某个⽅法或者字段被访问之前,进⾏拦截,然后在之前或者之后加⼊某些统⼀的处理⽅法。

拦截是AOP的⼀种具象的实现⽅式。

拦截器将很多service或者Controller中共有的⾏为提炼出来,在某些⽅法执⾏的前后执⾏,提炼为通⽤的处理⽅式,让被拦截的⽅法都能享受这⼀共有的功能,让代码更加简洁,同时,当共有的功能需要发⽣调整、变动的时候,不必修改很多的类或者⽅法,只要修改这个拦截器就可以了,可复⽤性很强。

Spring MVC 中的Interceptor拦截请求是通过HandlerInterceptor来实现的。

四、拦截器(Interceptor)必须实现的三个⽅法 1)总览 2)preHandle(HttpServletRequest request, HttpServletResponse response, Object handle)⽅法 该⽅法将在请求处理之前进⾏调⽤。

SpringMVC 中的Interceptor 是链式的调⽤的,在⼀个应⽤中或者说是在⼀个请求中可以同时存在多个Interceptor 。

每个Interceptor 的调⽤会依据它的声明顺序依次执⾏,⽽且最先执⾏的都是Interceptor 中的preHandle ⽅法,所以可以在这个⽅法中进⾏⼀些前置初始化操作或者是对当前请求的⼀个预处理,也可以在这个⽅法中进⾏⼀些判断来决定请求是否要继续进⾏下去。

Struts2默认拦截器解析

Struts2默认拦截器解析

Struts2默认拦截器解析使用struts2,拦截器大家经常使用,当然默认情况我们除了自定义的拦截器外,会使用struts2默认的拦截器,那他究竟有哪些默认的拦截器?每个拦截器都是做什么的呢?我们来看下对应的源码,打开对应源码下的struts2-default.xml文件我们可以看到对应很多的拦截器信息,如下<interceptors><interceptor name="alias"class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/><interceptor name="autowiring"class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInt erceptor"/><interceptor name="chain"class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/> <interceptor name="conversionError"class="org.apache.struts2.interceptor.StrutsConversionErrorIntercepto r"/><interceptor name="cookie"class="org.apache.struts2.interceptor.CookieInterceptor"/><interceptor name="createSession"class="org.apache.struts2.interceptor.CreateSessionInterceptor"/> <interceptor name="debugging"class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" /><interceptor name="externalRef"class="com.opensymphony.xwork2.interceptor.ExternalReferencesInterceptor"/><interceptor name="execAndWait"class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/> <interceptor name="exception"class="com.opensymphony.xwork2.interceptor.ExceptionMappingIntercepto r"/><interceptor name="fileUpload"class="org.apache.struts2.interceptor.FileUploadInterceptor"/> <interceptor name="i18n"class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/><interceptor name="logger"class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/> <interceptor name="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="scopedModelDriven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> <interceptor name="prepare"class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/> <interceptor name="staticParams"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scope"class="org.apache.struts2.interceptor.ScopeInterceptor"/><interceptor name="servletConfig"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="sessionAutowiring"class="org.apache.struts2.spring.interceptor.SessionContextAutowiring Interceptor"/><interceptor name="timer"class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/> <interceptor name="token"class="org.apache.struts2.interceptor.TokenInterceptor"/><interceptor name="tokenSession"class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/> <interceptor name="validation"class="org.apache.struts2.interceptor.validation.AnnotationValidation Interceptor"/><interceptor name="workflow"class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor "/><interceptor name="store"class="org.apache.struts2.interceptor.MessageStoreInterceptor"/> <interceptor name="checkbox"class="org.apache.struts2.interceptor.CheckboxInterceptor"/><interceptor name="profiling"class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" /><interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor"/> <!-- Deprecated name forms scheduled for removal in Struts 2.1.0. The camelCase versions are preferred. See ww-1707 --><interceptor name="external-ref"class="com.opensymphony.xwork2.interceptor.ExternalReferencesIntercep tor"/><interceptor name="model-driven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> <interceptor name="static-params"class="com.opensymphony.xwork2.interceptor.StaticParametersIntercepto r"/><interceptor name="scoped-model-driven"class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenIntercept or"/><interceptor name="servlet-config"class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> <interceptor name="token-session" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/><!-- Basic stack --><interceptor-stack name="basicStack"><interceptor-ref name="exception"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="checkbox"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/></interceptor-stack><!-- Sample validation and workflow stack --><interceptor-stack name="validationWorkflowStack"><interceptor-ref name="basicStack"/><interceptor-ref name="validation"/><interceptor-ref name="workflow"/></interceptor-stack><!-- Sample file upload stack --><interceptor-stack name="fileUploadStack"><interceptor-ref name="fileUpload"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample model-driven stack --><interceptor-stack name="modelDrivenStack"><interceptor-ref name="modelDriven"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample action chaining stack --><interceptor-stack name="chainStack"><interceptor-ref name="chain"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- Sample i18n stack --><interceptor-stack name="i18nStack"><interceptor-ref name="i18n"/><interceptor-ref name="basicStack"/></interceptor-stack><!-- An example of the params-prepare-params trick. This stack is exactly the same as the defaultStack, except that itincludes one extra interceptor before the prepare interceptor:the params interceptor.This is useful for when you wish to apply parameters directlyto an object that you wish to load externally (such as a DAOor database or service layer), but can't load that objectuntil at least the ID parameter has been loaded. By loadingthe parameters twice, you can retrieve the object in theprepare() method, allowing the second params interceptor toapply the values on the object. --><interceptor-stack name="paramsPrepareParamsStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="params"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"/><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><!-- A complete stack with all the common interceptors in place.Generally, this stack should be the one you use, though itmay do more than you need. Also, the ordering can beswitched around (ex: if you wish to have yourservlet-relatedobjects applied before prepare() is called, you'd need to moveservlet-config interceptor up.This stack also excludes from the normal validation and workflowthe method names input, back, and cancel. These typically areassociated with requests that should not be validated.--><interceptor-stack name="defaultStack"><interceptor-ref name="exception"/><interceptor-ref name="alias"/><interceptor-ref name="servletConfig"/><interceptor-ref name="prepare"/><interceptor-ref name="i18n"/><interceptor-ref name="chain"/><interceptor-ref name="debugging"/><interceptor-ref name="profiling"/><interceptor-ref name="scopedModelDriven"/><interceptor-ref name="modelDriven"/><interceptor-ref name="fileUpload"/><interceptor-ref name="checkbox"/><interceptor-ref name="staticParams"/><interceptor-ref name="params"><param name="excludeParams">dojo\..*</param></interceptor-ref><interceptor-ref name="conversionError"/><interceptor-ref name="validation"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref><interceptor-ref name="workflow"><paramname="excludeMethods">input,back,cancel,browse</param></interceptor-ref></interceptor-stack><!-- The completeStack is here for backwards compatibility for applications that still refer to the defaultStack by theold name --><interceptor-stack name="completeStack"><interceptor-ref name="defaultStack"/></interceptor-stack><!-- Sample execute and wait stack.Note: execAndWait should always be the *last* interceptor. --><interceptor-stack name="executeAndWaitStack"><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref><interceptor-ref name="defaultStack"/><interceptor-ref name="execAndWait"><paramname="excludeMethods">input,back,cancel</param></interceptor-ref></interceptor-stack><default-interceptor-ref name="defaultStack"/>是配置对应的拦截器栈,下面我们来看对应的拦截器栈都有哪些?都是做什么的?如果不配置拦截器,默认使用他自己的defaultStack,我们看到,defaultStack包含了基本上所有的拦截器,所以基本上都能满足我们的需求,但是我们一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,所以我们可以根据不通的场景,选择合适的拦截器栈。

struts2 parametersinterceptor 过滤

struts2 parametersinterceptor 过滤

struts2 parametersinterceptor 过滤
Struts2 ParametersInterceptor过滤器的主要功能是将ActionContext中的请求参数设置到ValueStack中。

如果ValueStack的栈顶是当前Action,那么将会把请求参数设置到Action中;如果栈顶是一个Model(Action实现了ModelDriven接口),那么将会把参数设置到Model中。

拦截器是Struts的一个概念,与过滤器类似,它可以近似地看作是过滤器。

拦截器的设计基于组件设计的应用,可以实现横切功能,并使这些实现相对Action甚至Struts2框架保持独立。

它提供了一种机制,使得开发者可以定义在一个Action执行的前后执行的代码,也可以在一个Action执行前阻止其操作。

同时,它也提供了一种可以提取Action中可重用部分的方式。

在Struts2框架中,默认的拦截器栈包含了18个拦截器,其中 ParametersInterceptor 用于实现数据自动封装。

过滤器和拦截器的区别

过滤器和拦截器的区别

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

4、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次拦截器:就是在你调用一个方法前,或者调用一个方法后,做一些业务逻辑的操作,例如打印字符串。

下面通过实例来看一下过滤器和拦截器的区别:使用拦截器进行/admin 目录下jsp页面的过滤:<package name="newsDemo" extends="struts-default" namespace="/admin"> <interceptors><interceptor name="auth" class="com.test.news.util.AccessInterceptor" /><interceptor-stack name="authStack"><interceptor-ref name="auth" /></interceptor-stack></interceptors><!-- action --><action name="newsAdminView!*" class="newsAction" method="{1}"></interceptor-ref><interceptor-ref name="defaultStack"/><interceptor-ref name="authStack"></interceptor-ref></action></package>下面是我实现的拦截器:package com.test.news.util;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.test.news.action.AdminLoginAction;public class AccessInterceptor extends AbstractInterceptor {private static final long serialVersionUID = -4291195782860785705L;public String intercept(ActionInvocation actionInvocation) throws Exception { ActionContext actionContext = actionInvocation.getInvocationContext();Map session = actionContext.getSession();Object action = actionInvocation.getAction();if (action instanceof AdminLoginAction) {return actionInvocation.invoke();}//check sessionif(session.get("user")==null ){return "logout";}return actionInvocation.invoke();//go on}}过滤器:就是在你访问某个JSP、Servlet或者Action之前,过滤掉一些信息。

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

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

拦截器与过滤器的区别:1、拦截器是基于java的反射机制的,而过滤器是基于函数回调2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次过滤器也就是写一个自己的类,让这个类实现于Filter这个接口,这个接口里有三个方法。

init(),doFilter(),destroy();主要是对doFilter()进行操作,你可以在这个方法里写你想进行的操作.写完这些之后,就是在web.xml里的配置了<filter><filter-name>myFilter</filter-name><filter-class>包名+实现Filter接口的类</filter-class></filter><filter-mapping><filter-name>myFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>在<url-pattern>里面设置了/*之后,也就是说在进行每一个操作时都会自动去执行自定义的filter里的doFilter方法里的代码.这样就可以进行相应的过滤操作了。

拦截器1、定义拦截器a.方法一:实现Interceptor接口public class MyInterceptor implements Interceptor {private String hello;//定义带参数的拦截器public String getHello() {return hello;}public void setHello(String hello) {this.hello = hello;}public void destroy() {// TODO Auto-generated method stubSystem.out.println("destroy");}@Overridepublic void init() {//服务器启动时自动加载一次System.out.println("init");System.out.println("hello");}@Overridepublic String intercept(ActionInvocation arg0) throws Exception { System.out.println("inercept");String result=arg0.invoke();System.out.println("finish");return result;}}b.方法二:继承AbstractInterceptor类public class MyInterceptor2 extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation arg0) throws Exception { System.out.println("intercept2");String result=arg0.invoke();System.out.println("finish2");return result;}}c.方法三:继承MethodFilterInterceptor类,定义过滤方法的拦截器public class MyInterceptor3 extends MethodFilterInterceptor {//过滤方法的拦截器@Overrideprotected String doIntercept(ActionInvocation arg0) throws Exception {arg0.addPreResultListener(new MyListener());//将监听器注册到里面System.out.println("myinterceptor3");String result=arg0.invoke();System.out.println("after myinterceptor3 ");return result;}}2、配置拦截器一旦实现了上面的拦截器,就可以在所有需要实现控制的Action中复用上面的拦截器。

为了使用该拦截器,首先在struts.xml文件中定义该拦截器,定义拦截器的配置片段如下:<!--定义拦截器--><interceptors><!--定义带有参数的拦截器--><interceptor name="myinterceptor"><param name="hello">world</param></interceptor><interceptor name="myinterceptor2"></interceptor><interceptor name="myinterceptor3"></interceptor><!—-也可以定义拦截器栈--><interceptor-stack name="myStack"><!--<interceptor-refname="myinterceptor"></interceptor-ref><interceptor-refname="myinterceptor2"></interceptor-ref><!—-要将struts默认的拦截器加入进去--><interceptor-refname="defaultStack"></interceptor-ref>--></interceptor-stack></interceptors><!--也可以自定义应用默认拦截器栈,这样如果 action里面没有引入别的拦截器栈,则都会应用自定义的默认拦截器栈--><!--<default-interceptor-refname="myStack"></default-interceptor-ref>-->3、应用拦截器<action name="register" method="abc"><result name="success">/success.jsp</result><result name="input">/register2.jsp</result><!--<interceptor-ref name="myinterceptor"><param name="hello">welcome</param></interceptor-ref>--><!--如果在action里手工的加入拦截器,就不会加载默认的拦截器,所以需要手动导入默认拦截器栈--><interceptor-ref name="defaultStack"></interceptor-ref><!--也可以直接导入自定义的拦截器栈,如下所示--><!--<interceptor-ref name="myStack"></interceptor-ref>--><!--拦截方法abc,execute多个方法中间用逗号隔开,排除用excludeMethods--><!--<interceptor-ref name="myinterceptor3"><param name="includeMethods">abc,execute</param></interceptor-ref>--></action>。

相关文档
最新文档