Struts2中的拦截器
来源:互联网 发布:java命名大全 编辑:程序博客网 时间:2024/05/21 22:36
系统自定义拦截器
Interceptor拦截器类似于我们前面学过的过滤器,是可以在action执行前后执行的代码。是我们做web开发时经常用的技术。比如:权限控制、日志等。我们也可以将多个Interceptor连在一起组成Interceptor栈。
Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此,在拦截器中如果使用类变量,要注意同步问题。
• 拦截器是在访问某个方法,字段之前或之后实施拦截。
• 拦截器是AOP的一种实现
• 拦截器栈(Interceptor Stack)
– 拦截器栈就是将拦截器按一定的顺序联结成一条链。
– 在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
• 实现原理
Struts2拦截器的实现原理相对简单,当请求struts2的action时,Struts 2会查找配置文件,并根据其配置实例化相对应拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。
拦截器在struts2中的应用
• 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作。比如:
– 像params拦截器将http请求中参数解析出来赋值给Action中对应的属性。
– Servlet-config拦截器负责把请求中HttpServletRequest实例和HttpServletResponse实例传递给Action
– …
• struts-default.xml中有一个默认的引用,在默认情况下(也就是中未引用拦截器时)会自动引用一些拦截器。
默认拦截器说明
• alias:对于HTTP请求包含的参数设置别名。
• autowiring:将某些JavaBean实例自动绑定到其他Bean对应的属性中。有点类似Spring的自动绑定,在Spring部分会详细说明。
• chain:在Web项目开发中,以前使用Struts开发时候经常碰到两个Action互相传递参数或属性的情况。该拦截器就是让前一Action的参数可以在现有Action中使用。
• conversionError:从ActionContext中将转化类型时候发生的错误添加到Action的值域错误中,在校验时候经常被使用到来显示类型转化错误的信息。
• cookie:从Struts2.0.7版本开始,可以把cookie注入Action中可设置的名字或值中。
• createSession:自动创建一个HTTP的Session,尤其是对需要HTTP的Session的拦截器特别有用。比如下面介绍的TokenInterceptor。
• debugging:用来对在视图间传递的数据进行调试。
• execAndWait:不显式执行Action,在视图上显示给用户的是一个正在等待的页面,但是Action其实是在“背后”正在执行着。该拦截器尤其在对进度条进行开发的时候特别有用。
• exception:将异常和Action返回的result相映射。
• fileUpload:支持文件上传功能的拦截器。
• i18n:支持国际化的拦截器。
• logger:拥有日志功能的拦截器。
• modelDriven:Action执行该拦截器时候,可以将getModel方法得到的result值放入值栈中。
• scopedModelDriven:执行该拦截器时候,它可以从一个scope范围检索和存储model值,通过调用setModel方法去设置model值。
• params:将HTTP请求中包含的参数值设置到Action中。
• prepare:假如Action继承了Preparable接口,则会调用prepare方法。
• staticParams:对于在struts.xml文件中Action中设置的参数设置到对应的Action中。
• scope:在session或者application范围中设置Action的状态。
• servletConfig:该拦截器提供访问包含HttpServletResquest和HttpServletResponse对象的Map的方法。
• timer:输出Action的执行时间。
• token:避免重复提交的校验拦截器。
• tokenSession:和token拦截器类似,但它还能存储提交的数据到session里。
• validation:运行在action-[方法名]-validation.xml(校验章节介绍)文件中定义的校验规则。
• workflow:在Action中调用validate校验方法。如果Action有错误则返回到input视图。
• store:执行校验功能时候,该拦截器提供存储和检索Action的所有错误和正确信息的功能。
• checkbox:视图中如果有checkbox存在的情况,该拦截器自动将unchecked的checkbox当作一个参数(通常值为“false”)记录下来。这样可以用一个隐藏的表单值来记录所有未提交的checkbox,而且缺省unchecked的checkbox值是布尔类型的,如果视图中checkbox的值设置的不是布尔类型,它就会被覆盖成布尔类型的值。
• profiling:通过参数来激活或不激活分析检测功能,前提是Web项目是在开发模式下。(涉及到调试和性能检验时使用)
• roles:进行权限配置的拦截器,如果登录用户拥有相应权限才去执行某一特定Action。
计时拦截器:
timer拦截器能够统计每个action的执行时间。原理很简单:就是在执行action前纪录一个时间,执行action后纪录一个时间。两个时间纪录相减即可获得action的执行时间。
设定一个系统拦截器:
<action name="house_*" class="com.sxt.action.HouseAction" method="{1}"> <!-- 使用计时拦截器 --> <interceptor-ref name="timer"/>
或者选定几个系统拦截器:
<package name="house" extends="struts_basic" namespace="/house"> <!-- 配置拦截器,defaultStack为系统默认使用的拦截器 --> <interceptors> <interceptor-stack name="myinterceptorstack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="timer"/> </interceptor-stack> </interceptors> <action name="house_*" class="com.sxt.action.HouseAction" method="{1}"> <!-- 使用计时拦截器 --> <!-- <interceptor-ref name="timer"/> --> <!-- 使用多个系统拦截器 --> <interceptor-ref name="myinterceptorstack"/> <result name="success">/index.jsp</result> <result name="error"></result> </action></package>
token防止表单重复提交拦截器
表单重复提交,是我们在写系统时一定要避免的!尤其是在购物、银行等系统中。通过令牌机制防止表单的重复提交(中级项目做过没有?)。
在struts2中,我们可以通过token拦截器轻松实现防止表单重复提交功能!
1. 在相应的action配置中增加:
<interceptor-ref name="token"/><!-- 表单重复提交出错跳转视图名:invalid.taken --><result name="incalid.token">/info.jsp</result>
然后在相应的jsp文件中添加:
<form action="user/userregister.sxt" method="post"> <!-- 加上标签,让拦截器区分 --> <s:token/> <div class="infos">
自定义拦截器
• 直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor
• 或者继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor
• 通过元素来定义拦截器
• 通过元素来使用拦截器
• 重写public String intercept(ActionInvocation ai) throws Exception
• 注意:
– 如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器
自定义的一个拦截器:
public class MyInterceptor extends AbstractInterceptor { /** * ActionInvocation action代理对象 */ @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub Object action = invocation.getAction(); System.out.println("获取嗲用的action:"+action.getClass().getSimpleName()); //前置处理 //执行action方法 invocation.invoke(); //后置处理 return null; }}
在xml文件中配置:
<package name="user" extends="struts_basic" namespace="/user"> <!-- 配置自定义拦截器,interceptors只能有一个,把两个拦截器写在一起 --> <!-- <interceptors> <interceptor name="myInterceptor" class="com.sxt.interceptor.MyInterceptor"/> </interceptors> --> <!-- 配置拦截器,直接在action中配置拦截器,则系统拦截器不起作用 --> <interceptors> <interceptor name="myInterceptor" class="com.sxt.interceptor.MyInterceptor"/> <!-- 配置拦截器栈 --> <interceptor-stack name="forminterceptorstack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="token"/> <interceptor-ref name="myInterceptor"/> </interceptor-stack> </interceptors> <action name="*_user_*" class="com.sxt.action.UserAction" method="{1}"> <!-- 引用token拦截器来防止表单重复提交 --> <interceptor-ref name="forminterceptorstack"/> <result name="success">/success.jsp</result> <result name="error">/fail.jsp</result> <result name="login">/login.jsp</result> <result name="input">/login.jsp</result> <!-- 表单重复提交出错跳转视图名:invalid.taken --> <result name="incalid.token">/info.jsp</result> </action></package>
jsp文件和之前一样;
方法拦截器
• Struts2提供MethodFilterInterceptor类,该类是AbstractInerceptor的子类,可以实现对Action方法的拦截.
• 重写:doIntercept方法
• MethodFilterInterceptor中参数配置:
– 如果一个方法同时在excludeMethods和includeMethods中出现,则会被拦截
– 如果不配置这两个参数,所在action所有方法都会拦截
<interceptor name="testmethod" class="com.cssxt.interceptor.TestMethodInterceptor"> <param name="includeMethods">add,add2</param> <param name="excludeMethods">add3,add4</param> </interceptor>
在xml文件中配置:
<package name="user" extends="struts_basic" namespace="/user"> <interceptors> <interceptor name="myMethodInterceptor" class="com.sxt.interceptor.MyMethodInterceptor"> <!--在里面设置要拦截的方法,为Action中的方法,不是拦截器中的方法--> <param name="includeMethods">login</param> <param name="excludeMethods"></param> </interceptor> <interceptor-stack name="userLogin"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="token"/> <interceptor-ref name="myMethodInterceptor"/> </interceptor-stack> </interceptors>
MyMethodInterceptor.java文件,拦截器
public class MyMethodInterceptor extends MethodFilterInterceptor{@Overrideprotected String doIntercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); System.out.println("获取嗲用的action:"+action.getClass().getSimpleName()); //前置处理 //获得session的用户对象 User user = (User) ActionContext.getContext().getSession().get("loginuser"); if(user == null){ return "login"; } //执行action方法 String result = invocation.invoke(); //后置处理 return result;}}
- struts2中的拦截器
- Struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- struts2中的拦截器
- Struts2中的拦截器
- struts2中的拦截器
- Struts2中的拦截器
- Struts2中的拦截器
- struts2中的拦截器
- Struts2中的拦截器
- Struts2中的拦截器
- 关于struts2中的拦截器
- HBase表跨集群迁移
- UEditor 后端配置项没有正常加载,上传插件不能正常使用!
- 五种Sublime text 3同时快速编辑多行内容
- Java 8 Spliterator接口 迭代式字数统计示例
- 洛谷1979/codevs3290 华容道,74行就写完了?
- Struts2中的拦截器
- onCreate获取view坐标和尺寸为0 的总结
- iOS调试——关于insertRowsAtIndexPaths方法崩溃以及动画实效的处理办法
- POJ 3026.Borg Maze
- 对sessionStorage 缓存的值进行加密
- TensorFlow:Chap4笔记总结
- js获取指定字符前后字符串的简单实例,js截取字符串;
- linux 中定时
- 关于静态变量的修改以及线程休眠