struts2自定义拦截器

网友投稿 241 2022-09-07

struts2自定义拦截器

​​你要懂得的知识​​​​AbstractInterceptor类​​​​自定义interceptor的配置​​

​​自定义interceptor的配置步骤如下​​​​普通类MyIntercepter java 自定义拦截器 在Action执行之前和执行之后各输出一句话​​​​配置拦截器​​​​运行结果​​

1.你要懂得的知识

首先放一张Struts2框架流程图

在这里我们需要关注的是这一部分

struts在执行Action之前会先创建一个ActionInvocation实例,然后检查Action是否配置有拦截器,如果有按照拦截器顺序一个一个的执行,然后进入result结果视图,调用相关的jsp或其它template,然后再按照拦截器的逆顺序执行一遍,最后到HttpServletResponse. 从图中我们可以看到ActionInvocation贯穿 interceptor-action-result-template的整个执行过程。可见拦截器机制就是早期的AOP(Aspect Orient Program,面向切面编程)思想。拦截器在AOP中用于在某个方法或字段被访问之前进行拦截,然后在之前,之后加入某些操作,AOP就是面向切面编程,是一种消除代码重复的方法。

2.AbstractInterceptor类

其实在Struts2中拦截器体系是一个重要的组成部分,可以认为struts2是一个空的容器,正是因为大量自带的拦截器的使用,让整个框架功能变得强大起来。在struts2的核心jar包中有一个struts-default.xml文件,里面有许多拦截器例如ServletConfigInterceptor,ModelDriverInterceptor。其中一些默认的拦截器如下

name="defaultStack"> dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...* input,back,cancel,browse input,back,cancel,browse

查看源码可以发现,这些拦截器都继承于AbstractInterceptor类,

public abstract class AbstractInterceptor implements Interceptor public void init() { } public void destroy() { } public abstract String intercept(ActionInvocation invocation) throws

在这个类中没有实现任何方法,就是一个简单的Interceptor接口。拦截器要在Action之前执行,只有在继承这个类时,通过实现它的抽象方法intercept()来完成拦截器的功能。也就是说,在intercept()方法中会先执行拦截器想要完成的任务,然后再转向Action执行,一般函数最后都会加上这句代码:​​String res=invocation.invoke();​​

具体的结构图如下:

我们自定义的拦截器MyInterceptor也可以通过继承AbstractInterceptor类来实现拦截器的功能。

3.自定义interceptor的配置

通过上面的知识,我们就可以自定义拦截器了。使用自定义拦截器需要知道当配置了任何一个拦截器,默认的拦截器栈就不会工作了。至于如何让默认的拦截器栈和自定义的拦截器一起工作,我们会在下篇文章写个小例子。

自定义interceptor的配置步骤如下:

普通类MyIntercepter .java 自定义拦截器 在Action执行之前和执行之后各输出一句话。

public class MyIntercepter extends AbstractInterceptor @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("拦截器拦截啦-----动作执行之前"); String res=invocation.invoke(); System.out.println("拦截器拦截啦-----动作执行之后"); return

其中​​String res=invocation.invoke();​​ 执行后返回的String类型的res即是Action中相应方法执行后返回的结果。

配置拦截器

struts.xml 在这个配置文件里,配置了一个struts2框架预定义的拦截器,名称为myIntercepter,然后在Action里引用了这个Action,指定这个Action和这个拦截器装配,对这个Action起作用。这样当struts2框架发现了这个装配的拦截器后,在调用Action之前就会去调用这个拦截器从而达到预期的目的。

运行结果

配置完这些,在浏览器中输入:​​http://localhost:8080/Interceptor/user/login.action​​

控制台输出结果为:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:C罗“可乐门”影响出圈,疫情难挡赛事大年营销战!
下一篇:#hiho1513 : 小Hi的烦恼 (bitset解决五维数点问题)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~