Struts2中拦截器

 

什么是拦截器:

拦截器是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用

Struts2Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或者之后执行拦截器的代码。

在项目中,我们经常用来拦截通过非正常程序而进行的访问。例如:权限操作。

Struts2的拦截器和Servlet过滤器类似。在执行Actionexecute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Actionexecute方法。

主要完成解析请求参数、将请求参数赋值给Action属性、执行数据校验、文件上传等工作。

怎么使用拦截器?

其中intercept方法是拦截器的核心方法,所有安装的拦截器都会调用之个方法。在Struts2中已经在struts-default.xml中预定义了一些自带的拦截器,如timerparams等。如果在<package>标签中继承struts-default,则当前package就会自动拥有struts-default.xml中的所有配置。代码如下:

<package name="demo" extends="struts-default" > ... </package>

创建一个Interceptor  可以自定义一个拦截器类实现com.opensymphony.xwork2.interceptor.Interceptor

                在这个接口中有三个方法  init  destory intercept, intercept方法是真正拦截的方法。

                在intercept方法中如果要向下继续执行,通过其参数ActionInvocation调用它的invoke()方法就可以。

声明一个Interceptor  

                在struts.xml文件中              

                <interceptors>

                    <interceptor name="" class=""/>

                </interceptors>

                注意:我们要自己声明一个interceptor可以在struts.xml文件中声明。

struts-default.xml中有一个默认的引用,在默认情况下(也就是<action>中未引用拦截器时)会自动引用一些拦截器。struts2中默认的拦截器是defaultStack. 

自定义拦截器需要特别注意的是不要忘记引入struts2默认的拦截器。为了实现某些操作,我们可以自定义拦截器。

在action中指定使用哪些拦截器. 

 <interceptor-ref name="my"/>

   注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。

拦截器的原理:

通过源代码的执行流程来了解拦截器的原理:

1.在StrutsPrepareAndExecuteFilter中查找在doFilter方法内有一句话 execute.executeAction (request, response, mapping) 执行Action操作.

2.在executeAction执行过程中会访问Dispatcher类中的serviceAction,在这个方法中会创建一个

ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace, name, method, extraContext, true, false);

 这就是我们的Action的代理对象  。

 3.查看ActionInvocation,查看其实现类 DefaultActionInvocation.

 在其invoke方法中

 if (interceptors.hasNext()) {//判断是否有下一个拦截器.
                    final InterceptorMapping interceptor = interceptors.next(); //得到一个拦截器
                    String interceptorMsg = "interceptor: " + interceptor.getName();
                    UtilTimerStack.push(interceptorMsg);
                    try {
                            resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
                            //调用得到的拦截器的拦截方法.将本类对象传递到了拦截器中。
                        }
                    finally {
                        UtilTimerStack.pop(interceptorMsg);
                    }
                }

 通过源代码分析,发现在DefaultActionInvocation中是通过递归完成所有的拦截调用操作.

以上是对struts2拦截器浅显的了解,欢迎补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值