拦截器的理解
Interceptor是Structs2的基石,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。框架的许多功能都是构建在在拦截器的基础之上, 比如数据校验、类型转换、文件上传与下载的文件类型限制、国际化等。并且Struts2还提供了大量的内置拦截器,这些拦截器完成了框架的大部分任务。
在Webwork的中文文档的解释为——Interceptor是Structs2的一种类,它可以动态拦截Action调用的对象、它提供了一种机制使开发者可以在一个Action执行之前或执行之后插入需要的代码,比如在执行之前阻止其执行,在执行后做一些相应的工作。
拦截器的实现原理
structs2的拦截器,当请求到达Structs2的ServletDispatcher时,Structs2会查找配置文件,并根据其配置,实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
拦截器的种类,拦截器的种类可以到structs2_default.xml中去亲自查看,structs2_defualt.xml在Web App Libraries文件夹下的structs2-core-xx.jar包中。
附截图2张
常用种类介绍:
Alias Interceptor——在不同请求之间将请求参数在不同名字之间转换,请求内容不变。
Chaining Interceptor——让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(result type="chain "结合使用)
Create Session Interceptor——自动创建HttpSession,用来为需要使用到的HttpSession的拦截器服务。
Exception Interceptor——将异常定位到一个画面
File Upload Interceptor——提供文件上传功能
I18n Interceptor——记录用户选择的locate
Debugging Interceptor——提供不同的调试用的页面来展示内部的数据状况
Prepare Interceptor——如果Action实现了Preparable,则该拦截器调用Action类的prepare 方法
Scope Interceptor——将Action状态存入session和application的简单方法
Timer Interceptor——输出Action的执行的时间
拦截器的使用,拦截器的拦截行为在Action的execute方法执行之前被执行。
在structs.xml文件中定义拦截器和拦截器栈:
<package name="my" extends="structs-default" namespace="/manage">
<interceptors>
<!-定义拦截器->
<interceptor name=";拦截器名" class="拦截器实现类">
<!-定义拦截器栈->
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器一">
<interceptor-ref name-"拦截器二">
</interceptor-stack>
</interceptors>
.....
</package>
使用自定义拦截器——实现权限控制拦截器类:
问题描述:当浏览者需要请求执行某个操作时,应用需要先检查浏览者是否登录,以及是否有足够的权限来执行该操作。
本文内容多有借鉴百度文档。