Struts2 拦截器详细配置过程

合集下载

Struts2_拦截器详细配置过程

Struts2_拦截器详细配置过程

Struts2 拦截器详细配置过程1:所有拦截器的超级接口Interceptor ,Action去实现这个接口; Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):Init()方法:在服务器起动的时候加载一次,并且只加载一次;Destroy()方法:当拦截器销毁时执行的方法;Interceptor()方法:其中里边有一个参数invocationpublic String intercept(ActionInvocationinvocation) throws xception {System.out.println("interceptor!!");String result=invocation.invoke();return result;}Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:在拦截器类中把hello当做属性set/get方式注入到拦截器类中;<interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 --><default-interceptor-ref name="myStack"></default-interceptor-ref>也可以在使用拦截器的时候给它设置参数:就是在一个action 的reslut下面配置上如下:<action name="register"class="com.zzz.struts2.action.RegisterAction"><result name="success">/success.jsp</result><!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 --><result name="input">/register.jsp</result><interceptor-ref name="myInterceptor"><param name="hello">welcome</param></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref></action>2.拦截器,拦截器栈和默认的拦截器之间的关系1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式: <interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor" class="com.zzz.struts2.i nterceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack></interceptors>拦截器的使用:1.先定义;2.在引用使用;<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor. MyInterceptor"><interceptor-ref name="myInterceptor"></interceptor-ref>2:struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>如果想改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name="myStack"></default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;3:抽象的拦截器类AbstractInterceptor1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();和destroy()方法,可以去继承这个抽象拦截器类;它的使用跟上边的没有什么区别;4:方法过滤拦截器MethodFilterInterceptor1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.<interceptor-ref name="myInterceptor3"><param name="includeMethods">execute</param><param name="excludeMethods">execute</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref>其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;5:鉴听器PreResultListener接口1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;然后向需要它的拦截器中注册进去如下代码:publicclass MyInterceptor3 extends MethodFilterInterceptor { privatestaticfinallong serialVersionUID = 3756655410194005443L;@Overrideprotected StringdoIntercept(ActionInvocation invocation) throws Exception { //把鉴听器注册到拦截中去;invocation.addPreResultListener(new MyListener());System.out.println("my Interceptor3");String result=arg0.invoke();System.out.println("my interceptor3 finshed!");return result;}}。

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库

struts2拦截器--将用户操作日志存入数据库第一篇:struts2拦截器--将用户操作日志存入数据库struts2拦截器--将用户操作日志存入数据库1.建表,如下所示:2.新建OperationLogModel.java,其具有上述属性。

3.自动生成PO4.在struts.xml中配置拦截器:5.如下例子中的用户登录和修改密码,要在相应xml文件中加入,即:indexchangePasswordPre6.在项目中新建文件夹log,在其下新建类LogInterceptor .java,如下:package com.bfw.crms.log; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import ng.StringUtils; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.bfw.crms.action.BulletinAction; import com.bfw.crms.action.SystemAction; import com.bfw.crms.model.EmployeeModel; import com.bfw.crms.model.OperationLogModel; import com.bfw.crms.po.OperationLog; import com.bfw.crms.util.BeanUtil; import com.bfw.crms.util.DateTimeUtil; import com.ninetowns.framework.dao.ObjectDao; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor;@SuppressWarnings("serial")public class LogInterceptor extends AbstractInterceptor{ private String logName;private String logContent;protected Logger log = Logger.getLogger(getClass()); protected HttpSession getSession(){return getRequest().getSession();}protected HttpServletRequest getRequest(){return ServletActionContext.getRequest();}public void init() {}private ObjectDao objectDao = null;public ObjectDao getObjectDao(){return objectDao;}public void setObjectDao(ObjectDao objectDao){this.objectDao = objectDao;}@Overridepublic String intercept(ActionInvocation ai) throws Exception {Object action= ai.getAction();String method= ai.getProxy().getMethod();try{if(StringUtils.isBlank(method)) method = "method";EmployeeModel sysUser (EmployeeModel)this.getSession().getAttribute("employee");String userName = "";if(sysUser!=null) userName = sysUser.getName();=String currentTime = DateTimeUtil.getDateTime();String logContentHead = "用户"+userName+currentTime;ai.invoke();//执行被拦截actionif (action instanceof BulletinAction) {if(method.equals("save")){logName = "保存部门";logContent = logContentHead+"保存部门:"+ai.getStack().findValue("Name");(logContent);addSysLog(logName,logContent);}if(method.equals("delete")){logName = "删除部门";logContent = logContentHead +""+((String[])(ai.getStack().findValue("flag_id"))).length+"条部门信息";(logContent);addSysLog(logName,logContent);}}if (actioninstanceof SystemAction) {if(method.equals("login")){logName = "登录系统";logContent = logContentHead;(logContent);addSysLog(logName,logContent);}if(method.equals("changePassword")){logName = "修改密码";logContent = logContentHead +"删除1条单位信息";(logContent);addSysLog(logName,logContent);}}}catch(Exception e){e.printStackTrace();}return Action.SUCCESS;}/*** 插入系统日志 model2po()* @param logName* @param logContent*/删除private void addSysLog(String logName,String logContent){ OperationLogModel operationModel = new OperationLogModel();OperationLog operationPO = new OperationLog();operationModel.setOperation(logContent);BeanUtil.model2po(operationModel, operationPO);this.getObjectDao().saveObject(operationPO);}} OK第二篇:Struts2中的拦截器与过滤器学习拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,response 提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do 的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。

第三章 Struts2拦截器

第三章 Struts2拦截器

11
第三章 Struts2拦截器
• 本章内容

3.1 Struts2工作原理 3.2 拦截器概述 3.3 拦截器的配置 3.4 自定义拦截器 3.5 自定义拦截器综合应用--权限验证
12
3.2.1 拦截器的概念

拦截器(Interceptor)是Struts2的核心组成部分。很多功能都是构建在 拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据 校验等,Struts2利用内建的拦截器,完成了框架内的大部分操作。 在Struts2文档中对拦截器的解释为--拦截器是动态拦截Action调用 的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块 ,这个模块可以在Action执行之前或者之后运行,也可以在一个 Action执行之前阻止Action执行。同时也提供了一种可以提取Action 中可重用的部分的方式。 拦截器是Struts2 更高层次的解耦,无须侵入框架本身便可以添加新 的功能。 拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层 通过动态代理模式完成。
</struts>
3.3.1 拦截器的配置
拦截器是配置在包下的。在包下配置了一系列的拦截器,但仅 仅是配置在该包下,并没有得到应用。如果要应用这些拦截器 ,就需要在<action>配置中引用这些拦截器, 格式为: <interceptor-ref name="…"> • 例子:

<action name="Action名" class="Ac2拦截器实现原理
拦截器围绕着Action和Result的执行而执行,其工作方式如上 图。 • 从图中可以看到,在Action和Result执行之前,为Action配置 的拦截器将首先被执行,在Action和Result执行之后,拦截器 将重新获得控制权,然后按照与先前调用相反的顺序依次执行 。在整个执行过程中,任何一个拦截器都可以选择直接返回, 从而终止余下的拦截器、Action和Result的执行。例如:当一 个未授权的用户访问受保护的资源时,执行身份验证的拦截器 可以直接返回。

struts2_拦截器(Interceptors)

struts2_拦截器(Interceptors)

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

如何自定义一个拦截器?自定义一个拦截器需要三步:1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在strutx.xml中注册上一步中定义的拦截器。

3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

Interceptor接口声明了三个方法:public interface Interceptor extends Serializable {void destroy();void init();String intercept(ActionInvocation invocation) throws Exception; }Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。

如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:public abstract class AbstractInterceptor implements Interceptor {public void init() {}public void destroy() {}public abstract String intercept(ActionInvocation invocation) throws Exception;}在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

Struts2拦截器及其用法说明

Struts2拦截器及其用法说明
【预备拦截器】
prepare
如果action实现Preparable接口,将会调用该拦截器的prepare()方法
Profiling Interceptor
【概要拦截器】
profiling
允许action记录简单的概要信息日志
Scope Interceptor
【作用域拦截器】
scope
这是范围转换拦截器,它可以将Action状态信息保存到HttpSession范围,或者保存到ServletContext范围内。
token
org.apache.struts2.interceptor.TokenInterceptor
tokenSesห้องสมุดไป่ตู้ion
org.apache.struts2.interceptor.TokenSessionStoreInterceptor
validation
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor
Token Interceptor
【令牌拦截器】
token
检查action的合法令牌,以防止重复提交表单,当表单被多次提交时,跳转到一个错误页面
Token Session Interceptor
【令牌会话拦截器】
tokenSession
功能与令牌拦截器相同,但是对于非法令牌,提交的数据将保存在会话中,不跳转到错误页面,再次生成与第一次相同的页面。
【消息存储拦截器】
store
在会话中为action存储和检索消息、字段错误以及action错误,该拦截器要求action实现ValidationAware接口

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官方网站)

Struts2拦截器(翻译自Struts2官方网站)

Struts2拦截器(翻译自Struts2官方网站)许多的Struts2中的Action需要共享一些共用信息或者是模块,有些Action需要对输入进行验证,另外一些Action 或许需要对文件上传之前做一些逻辑处理,又或者一些Action需要对重复提交进行保护,还有一些Actiion需要在页面显示前,初始化下拉框或一些页面组件。

Struts2框架使用了Interceptor(拦截器)策略使共享这些关心的模块更简单的使用起来。

当需要使用到一些映射到Action的资源时,框架生成了Action对象,但在该Action 被执行前,执法该Action中的方法被另外一个对象拦截了,在Action执行时,可能再次被拦截,我们亲切地称此对象为拦截器。

理解拦截器拦截器能够在一个Action执行前后拦截它。

目前的很多框架的核心实现均是基于拦截器。

(本人说两句,OOP 因为拦截器而显得更为精彩,AOP必将成为下一个核心关注点)。

拦截器可以帮助实现很多公共的内容,其中有重复提交,类型转换,对象初始化,验证,文件上传,页面初始化等等。

由于每个拦截器都可以像热插拔的模块,你可以在你的Action中正确地去使用需要的拦截器。

拦截器可以配置在一个基类的action中,自定义的拦截器可以尽量少或者配合框架中的已有的拦截器。

所以套用句外国人的话说吧,在一个Action执行时,让我们为它再提升一些吧,给Action更大的舞台更强大的力量吧。

如上图所示,Struts2的Action被一个或者多个拦截器围绕,所有的用户请求都会被拦截器所拦截,最后交给Action处理,处理结果以逻辑视图的方式返回给用户,调用的流程由配置文件来实现。

在一些例子中,一个拦截器可以解决像重复提交以及验证失败这样的例子。

当然也可以改变一个Action在执行前的状态。

拦截器可以定义为一个指定执行顺序的链中,在某些情况下,拦截器的顺序非常的重要。

="struts-default"&gt;该元素的意思是定义了一个继承于struts-default包的包,那么该包中的所有action均可使用struts-default.xml中定义的拦截器以及拦截器链。

struts2拦截器详解

struts2拦截器详解


void destroy(): – 该方法在拦截器实例被销毁之前调用,用于释放在init()方法中分配的资源。该方法只执 行一次。
String intercept(ActionInvocation invocation) throws Exception: – 该方法在Action执行之前被调用,拦截器为Action提供的附加功能在该方法中实现。利用 invocation参数,可以获取action执行的状态。在intercept()方法中,如果要继续执行后续 的部分(包括余下的应用于Action的拦截器、Action和Result),可以调用invocation.invoke()。 如果要终止后续的执行,可以直接返回一个结果码,框架将根据这个结果码来呈现对应 的结果视图。

Struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "/dtds/struts-2.0.dtd">


说明
• • 当执行Action的input、back和cancel方法时,验证拦截器将不执行对输入数据的验证。 当执行Action的execute方法时,验证拦截器将执行对输入数据的验证。 在设置拦截器或排除的方法时,如果有多个方法,那么以逗号(,)分隔,如上所示。如果 一个方法的名字同时出现在execludeMethods和includeMethods参数中,那么它会被当 作要拦截的方法。也就是说, includeMethods优先于execludeMethods。 在编写拦截器类的时候要注意,拦截器必须是无状态的,换句话说,在拦截器类中不 应该有实例变量。这是因为struts2对每一个体Action的请求使用的是同一个拦截器实例 来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个 线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。

Struts 2的拦截器

Struts 2的拦截器

Struts 2将它的核心功能放到拦截器中实现而不是集中放在 核心控制器中实现。
拦截器的方法在Action执行之前或者执行之后自动地执行, 从而将通用的操作动态地插入到Action执行的前后,这样有 利于系统的解耦,这种功能的实现类似于我们自己组装的 电脑,变成了可拔插式。
如果有一批拦截器经常固定在一起使用,可以将这些小规 模功能的拦截器定义成为大规模功能的拦截器栈。
<interceptor-ref name="interceptorName|interceptorStackName">
</interceptor-ref>
<引/in用t<e/ri拦cnetp截etroc器resp>t时or-,stSactkr>uts 2并不区分拦截器和拦截器栈,所以
<<在!d-e定-fa定u义l义t-拦默in认t截e的r器c拦e截p栈t器or时引-r用e,f -可n-a>m以e="引int用er其cep他tor的Nam拦e|截int器erc栈ept。orStackName"/>
5
10.1.3 拦截器示例
通过示例代码来讲解拦截器的三个阶段,代码如下所示。
public class MyTimerInterceptor extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation)
</package>
9
10.2.3 自定义拦截器
在Struts 2程序的开发中,如果想要开发自己的拦截器类, 所 有 的 Struts 2 拦 截 器 都 直 接 或 间 接 实 现 接 口 com.opensymphony.xwork2.interceptor.Interceptor 。 该 接 口提供三个方法,方法如下所示:

Struts2拦截器拦截器是Struts2的核心组成部分

Struts2拦截器拦截器是Struts2的核心组成部分

}
二、自定义拦截器
2.通过AbstractInterceptor类实现拦截器
前面通过实现Interceptor接口实现了自定义拦截器类的,但是我 们发现就算我们不需要对拦截器的初始化和销毁进行任何操作,也不 得不实现init方法和destroy方法。
这时可以使用另外一个类AbstractInterceptor。该类是一个抽象 类并实现了Interceptor接口,其代码如下所示。 public abstract class AbstractInterceptor implements Interceptor {
3.截器配置拦截器
前面介绍了如何定义拦截器类,但是这时拦截器还不能起作用。 要拦截器其作用则必须在struts.xml文件中配置该拦截器,下面介绍 几种配置拦截器的方法。
1.最简单的配置 2.配置并传递参数 3.配置多个拦截器 4.配置拦截器栈 5.配置拦截器栈并传递参数 6.在拦截器栈中再引入拦截器栈
public void init() {//初始化方法} public void destroy() {//销毁方法} public abstract String intercept(ActionInvocation invocation) throws Exception; //拦截方法 }
二、自定义拦截器
二、自定义拦截器
4.使用拦截器
前面已经介绍了如何配置拦截器,但是现在拦截器还是不能起作 用。因为Action还不知道要使用哪个拦截器,所以还必须在Action元 素中通过添加interceptor-ref节点来指定使用哪个拦截器,代码格式 如下所示。 <action name="业务控制器名" class="业务控制器实现类">

第4章 Struts2拦截器

第4章 Struts2拦截器
第四章 Struts 2拦截器
2010-3-22
内容提要
4.1 Struts2拦截器
4.2 自定义拦截器
4.3 Struts2拦截器高级应用
4.1 Struts2拦截器
拦截器(Interceptor)是Struts2的核心和基础,有许 多功能都是构建于它之上,如国际化、转换器、校 验等。
4.1.1 拦截器初识
•用户实现的Action类仅仅是Struts 2的ActionProxy的代理目标;用
户的Action类无需访问HttpServletRequest对象——因为用户 实现的业务控制器并没有与Servlet API耦合,但用户的请求数 据又是包含在HttpServletRequest对象里,怎么办呢?
拦截器可以让你在 Action被执行之前或 之后进行一些处理。 同时,拦截器也可以 让你将通用的代码模 块化并作为可重用的 类。
Struts2拦截器初识(3)
•Struts 2框架则提供了系列 拦截器,该系列拦截器负责将 HttpServletRequest请求中 的请求参数解析出来,传入到 Action中,并回调Action的 execute方法来处理用户请求。
配置和使用拦截栈(2)
配置和使用拦截栈(3)
见示例4.3
返回
4.2 自定义拦截器
做为“框架(framework)”,可扩展性是不可或缺的。 虽然,Struts 2为我们提供了丰富的拦截器实现,但是这并 不意味我们失去创建自定义拦截器的能力,恰恰相反,在 Struts 2自定义拦截器非常容易。
4.2.1 自定义拦截器
Struts2拦截器初识(5)
Struts 2的拦截器实现相对简单。当请求Struts 2的某Action 时,Struts 2会查找配置文件,并根据配置实例化其相对应 的拦截器对象,然后串成一个列表(list),最后一个一个 地调用列表中的拦截器。

详解Struts2拦截器机制

详解Struts2拦截器机制

详解Struts2拦截器机制Struts2的核⼼在于它复杂的拦截器,⼏乎70%的⼯作都是由拦截器完成的。

⽐如我们之前⽤于将上传的⽂件对应于action实例中的三个属性的fileUpload拦截器,还有⽤于将表单页⾯的http请求参数设置成action中对应的属性的param拦截器等。

总之,在整个Struts框架中拦截器的作⽤是相当⼤的,本篇将从以下⼏点详细介绍下有关Struts拦截器的内容:拦截器在Struts中的作⽤⾃定义拦截器实现类配置拦截器(包含配置默认拦截器)引⽤拦截器配置拦截指定⽅法的拦截器拦截器的拦截顺序⼀、拦截器在Struts中的作⽤在我们的web.xml中,我们配置了⼀个过滤器,实现将所有请求交付StrutsPrepareAndExecuteFilter类。

⼀旦接受到任意action的请求,该类会创建和初始化⼀个ActionProxy实例,它代理了具体的action,在其中我们可以添加任意拦截器在execute⽅法执⾏之前和之后做⼀些额外的操作,最终会调⽤该action实例的execute⽅法,为⽤户返回视图结果字符串,然后系统会根据该视图结果字符串调取相应的视图页⾯。

下图是拦截器和action之间的关系:这是⼀种典型的AOP思想,当我们在Struts.xml中定义⼀个包的时候,⼤部分情况下我们会继承struts-default⽂件,所以虽然我们在⾃⼰的配置⽂件中并没有⼿动配置任何的拦截器,但是我们创建的action却被很多拦截器拦截处理,就是因为struts-default中配置的拦截器⽣效了。

Struts中内建了很多的拦截器,他们⼤多被配置在struts-default⽂件中,详细的内建拦截器的介绍可以参考官⽅API,接下来我们看如何⾃定义⼀个拦截器。

⼆、⾃定义拦截器实现类想要实现⾃⼰的拦截器类只需要实现 com.opensymphony.xwork2.interceptor.Interceptor.Interceptor 接⼝即可,该接⼝中有如下⼏个⽅法:public abstract void destroy();public abstract void init();public abstract String intercept(ActionInvocation paramActionInvocation)throws Exception;init ⽅法在执⾏拦截⽅法之前回调,主要⽤于初始化⼀些资源,destroy 与init ⽅法对应,在拦截器实例被销毁之前回调,主要⽤于释放在init ⽅法中打开的资源。

如何使用Struts2拦截器.

如何使用Struts2拦截器.

Struts 2
1 struts2拦截器
1.1 如何使用struts2拦截器
如何使用struts2拦截器,或者自定义拦截器。

特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):
也可以改为对全局Action设置自己需要的拦截器,如下:
在struts.xml里面定义全局的配置设置
struts-action.xml里面配置Action如下:
你的拦截器可以正常工作了。

struts2自带的配置及其拦截器配置
拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。

拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

java struts2入门学习 拦截器学习

java struts2入门学习   拦截器学习

一、拦截器,拦截器栈1、拦截器的作用拦截器本质上和servlet的过滤器是一样的。

在struts2中,拦截器能够对Action前后进行拦截,拦截器是一个可插拨的,你可以选择使用拦截器,也可以卸载拦截器。

2、拦截器执行顺序在struts.xml文件中,<intercepto-ref/>中先引用的先执行,后引用的后执行。

如果某个拦截器出错或不允许通过,那么下一个拦截器是不允许执行的。

需要拦截哪个Action,就在哪个Action对应的<action>标签中配置即可。

在部署web应用时,拦截器的空参构造方法和init()方法各执行一次,每次请求时interc ept()方法都会执行一次。

3、自定义拦截器1)声明一个拦截器<pacakge><interceptors><interceptor name="LoginInterceptor"class="interceptor.Login Interceptor"></interceptor></interceptors><action></action></package>注意:这里interceptors与action标签同级。

其中class对应拦截器的全路径。

name 对应拦截器的名称,这个可以自己随便定义,建议与类名相同,此名称要唯一。

2)引用一个拦截器:<action><!--引用自定义的拦截器--><interceptor-ref name="LoginInterceptor"></interceptor-ref><action>注意:如何引用一个拦截器?即在Action中<action>标签下配置即可。

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包含了基本上所有的拦截器,所以基本上都能满足我们的需求,但是我们一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,所以我们可以根据不通的场景,选择合适的拦截器栈。

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

Struts2 拦截器详细配置过程1:所有拦截器的超级接口Interceptor ,Action去实现这个接口;Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):Init()方法:在服务器起动的时候加载一次,并且只加载一次;Destroy()方法:当拦截器销毁时执行的方法;Interceptor()方法:其中里边有一个参数invocationpublic String intercept(ActionInvocation invocation) throws xception {System.out.println("interceptor!!");String result=invocation.invoke();return result;}Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.2:可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:在拦截器类中把hello当做属性set/get方式注入到拦截器类中;<interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-refname="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 --><default-interceptor-ref name="myStack"></default-interceptor-ref>也可以在使用拦截器的时候给它设置参数:就是在一个action 的reslut下面配置上如下:<action name="register"class="com.zzz.struts2.action.RegisterAction"><result name="success">/success.jsp</result><!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 --><result name="input">/register.jsp</result><interceptor-ref name="myInterceptor"><param name="hello">welcome</param></interceptor-ref><interceptor-ref name="myStack"></interceptor-ref> </action>2.拦截器,拦截器栈和默认的拦截器之间的关系1:拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式:<interceptors><!-- 先定义拦截器 --><interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"><!-- 指定系统初始化给拦截器的参数 --><param name="hello">张钊钊</param></interceptor><!-- 加到自己设置的拦截器栈里边去 --><interceptor-stack name="myStack"><interceptor-ref name="myInterceptor"></interceptor-ref><interceptor-refname="defaultStack"></interceptor-ref></interceptor-stack></interceptors>拦截器的使用:1.先定义;2.在引用使用;<interceptor name="myInterceptor"class="com.zzz.struts2.interceptor.MyInterceptor"> <interceptor-ref name="myInterceptor"></interceptor-ref>2:struts2中有一个系统默认的拦截器栈是 defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>如果想改变系统默认的拦截器栈,可以这样配置:<default-interceptor-ref name="myStack"></default-interceptor-ref>其中myStack是自己定义的拦截器栈名字;如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;3:抽象的拦截器类AbstractInterceptor 1:Interceptor这个超级拦截器接口,有三方法需要实现,但是如果不想使用init();和destroy()方法,可以去继承这个抽象拦截器类;它的使用跟上边的没有什么区别;4:方法过滤拦截器MethodFilterInterceptor1:上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类;它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.interceptor-ref name="myInterceptor3"><param name="includeMethods">execute</param><param name="excludeMethods">execute</param></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref>其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;5:鉴听器1:它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;然后向需要它的拦截器中注册进去如下代码:publicclass MyInterceptor3 extends MethodFilterInterceptor { privatestaticfinallong serialVersionUID = 3756655410194005443L;@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception {//把鉴听器注册到拦截中去;invocation.addPreResultListener(new MyListener());System.out.println("my Interceptor3");String result=arg0.invoke();System.out.println("my interceptor3 finshed!");return result;}}。

相关文档
最新文档