首页>>程序代码>>Struts2 自定义拦截器需要注意事项总结
Struts2 自定义拦截器需要注意事项总结
来源: http://emavaj.blog.163.com/ 时间: 2014-12-24 23:13:31

Struts2里面想定义个拦截器是非常简单的

只需要集成Struts2的抽象类

AbstractInterceptor

然后重写intercept方法,就可以完成拦截器

最后在struts.xml中配置上:

<interceptors>  //存在于package下

   <interceptor name="拦截器名" class="类路径"/>

</interceptors>

这样就可以在action中使用interceptor-ref来引用拦截器了

在此过程中,有一些问题是特别需要注意的

1) 拦截器的工作原理

invocation.invoke();

这一句就是拦截器的核心,意思就是向下一级拦截器执行

如果没有下一级了,那么就执行Action 中的方法

也就是说,拦截器就像一层层的过滤网,invoke就是物体可以穿过这一层网了

当拦截器到了底层,也就是Action执行,

invoke返回的String就是Action的结果,

如果:

public String intercept(ActionInvocation invocation) throws Exception {

  //...无论你做什么

  return "login";

}

这个请求永远是指向"login"的result

也就是说,你可以在拦截器中改变Action的result的走向~

也可以为Action添加内容:invocation.getInvocationContext()

这样你就可以拿到Context,(从而拿到request、session等)为Action添加内容.

2) Action的前后拦截

如果能理解拦截器的意义,那么这个肯定是理解的

-------------- Action执行前拦截:

// ....你的逻辑

String re = invocation.invoke();

return re;

-------------- Action执行后拦截:

String re = invocation.invoke();

//....你的逻辑  (其中re的值可能被改变,从而导致result的走向不同)

return re;

3) 默认拦截器栈

许多个拦截器的一个组就是一个拦截器栈

Struts2的默认拦截器栈(defaultStack),可以说就是Struts2 大部分默认功能的实现代码!

(参数获取,流处理,结果集等)

如果你定义了一个自己的拦截器,

之后你让你的Action使用到这个拦截器,而且仅使用了这个拦截器(也就是没有使用Struts2默认拦截器栈)

那么你的Action就丢失了所有Struts提供的默认功能(包括参数传递,流处理等等)

所以你选要的是,使用回Struts2的默认拦截栈,再加上你的拦截器

方法1,把你的拦截器并入默认拦截器中:

<interceptors>

   <interceptor name="新拦截器" class="com.xxxxxxxx"/>

   <interceptor-stack name="新默认拦截器(名字随便)">

    <interceptor-ref name="defaultStack"/>

    <interceptor-ref name="新拦截器"/>

   </interceptor-stack>

  </interceptors>

  <default-interceptor-ref name="新默认拦截器"/>

方法2,你的Action同时使用多个拦截器(如果顺序有关系,注意顺序)

...略

 

本页地址:http://www.easytd.com/chengxudaima/d_14122423536.html

上一篇:PHP常见漏洞被攻击原因分析 下一篇:Struts2 批量上传,文件下载的方法及需要注意的问题