struts2中拦截器的使用
来源:互联网 发布:js为标签添加属性 编辑:程序博客网 时间:2024/05/21 07:06
先来了解一下什么是拦截器
拦截器:它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行
前阻止其执行,strut2核心功能都是通过拦截器来实现的。
拦截器栈:由多个拦截器组成。
作用:对于action的一些公共处理代码可以放到拦截器中来实现。如权限控制等。
下图为struts2运行流程
从图中可以看出action执行前执行了拦截器中的代码,action执行后也执行了拦截器中的代码
拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1了。
这就好比,你要去奶奶家,需要通过 水泊梁山->盘丝洞 -> 索马里,到了奶奶家,看奶奶回来的时候,就必须要通过 索马里 -> 盘丝洞 -> 水泊梁山。
自定义一个拦截器的步骤:
1 .自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。2 .在struts.xml中注入上一步中定义的拦截器。
3 .在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认
接下来写一个拦截器的例子,计算action的运行时间
编写一个计时器拦截器
public class MyTimeInterceptor extends AbstractInterceptor{@Overridepublic String intercept(ActionInvocation arg0) throws Exception {//预处理工作System.out.println("thi is i1 start");long startTime=System.currentTimeMillis();//执行后续拦截器或ActionString result=arg0.invoke(); //后续处理工作long execTime=System.currentTimeMillis()-startTime;System.out.println("The interval time is "+execTime+" ms");return result;}}在struts.xml文件中定义拦截器
<interceptors><interceptor name="myTimer" class="base.MyTimeInterceptor"></interceptor></interceptors>
注:拦截器的定义需要放在package标签的最上边
在需要添加拦截器的action中配置
<action name="reg" class="base.RegAction"><result name="success">/regsuccess.jsp</result><result name="fail">/reg.jsp</result><result name="input">/reg.jsp</result><interceptor-ref name="myTimer"></interceptor-ref></action>注意:如果使用上述拦截器,那么reg中之前struts提供的数据校验,数据自动封装等功能将无法使用,不过我们可以加再次加入默认的拦截器
struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器
只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器
<action name="reg" class="base.RegAction"><result name="success">/regsuccess.jsp</result><result name="fail">/reg.jsp</result><result name="input">/reg.jsp</result><interceptor-ref name="myTimer"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action>
修改为上边代码后strtus默认提供的功能就又可以使用了
拦截器栈
从结构上看,拦截器栈相当于多个拦截器的组合在功能上看,拦截器栈也是拦截器
<interceptors><interceptor name="myTimer" class="base.MyTimeInterceptor"></interceptor><interceptor name="myTimer2" class="base.MyTimer2"></interceptor><interceptor-stack name="is"><interceptor-ref name="myTimer"></interceptor-ref><interceptor-ref name="myTimer2"></interceptor-ref></interceptor-stack></interceptors><action name="reg" class="base.RegAction"><result name="success">/regsuccess.jsp</result><result name="fail">/reg.jsp</result><result name="input">/reg.jsp</result><interceptor-ref name="is"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></action>
拦截器的应用,主要应用于网站登录拦截,比如一个购物商城,当用户没有登录时,点击购买商品,页面会自动跳转的登录界面,这就是拦截器的作用,在执行购买商品action之前在拦截器中判断session中user是否为空,通过返回不同的字符串来进行不同的也页面跳转。
主要实现代码
public String intercept(ActionInvocation arg0) throws Exception {//判断是否登录 得到session对应的key 进行判断Map<String,Object> sessionMap = ActionContext.getContext().getSession();String userName = (String)sessionMap.get("username");//如果没有登录,则不掉用invoke,而直接返回字符串if (userName==null || userName.equals(""))return "login";//如果已经登录则调用invoke,让后续拦截器或action正常执行elsereturn arg0.invoke();}
阅读全文
0 0
- Struts2中Interceptor拦截器的使用
- Struts2中execAndWait拦截器的使用
- struts2中拦截器的使用
- struts2中拦截器使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2的拦截器使用
- struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- STRUTS2拦截器的使用
- Struts2拦截器的使用
- Struts2拦截器的使用
- final关键字、finally{}、finalize() 的区别
- shiro授权源码
- python做词云Wordcloud
- spring回顾系列:依赖注入
- LeetCode283. Move Zeroes 解答
- struts2中拦截器的使用
- 2017年10月6日提高组T2 有趣的异或
- 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?
- <Linux>压缩解压常用命令
- maven 的私库和镜像的配置
- Stanford nlp 初步之词性标注
- String类型
- Linux SPI总线设备驱动模型详解
- hdu 3478 Catch(判断奇数环)