一、拦截器简介:
Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。
拦截器栈:
从结构上看,拦截器栈相当于多个拦截器的组合。
在功能上看,拦截器栈也是拦截器。
拦截器的执行过程是一个递归的过程,工作原理类似于过滤器。

二、自定义拦截器的应用

案例:统计Action的执行花费时间:

思路:执行之后的时间-执行之前的时间= 执行Action消耗的时间

1. 定义拦截器
1.1.创建一个拦截器类继承自AbstractInterceptor类
1.2.实现intercept方法 eg:
public String intercept(ActionInvocation invocation) throws Exception {
//1.执行action之前
long start=System.currentTimeMillis();
//2.执行下一个拦截器,如果是最后一个拦截器,则执行目标action
String result=invocation.invoke();
//3.执行action之后
long end=System.currentTimeMillis();
//4.花费的时间
long time=end-start;
System.out.println("执行花费的时间: "+time+" ms");
return result;
} 2. 配置拦截器
<interceptors>
<interceptor name="timeinterceptor" class="com.imooc.interceptor.TimerInterceptor"></interceptor>
</interceptors> 3. 引用拦截器
<interceptor-ref name="timeinterceptor"></interceptor-ref>

三、Struts2内置常用的拦截器

1.params拦截器:
-负责将请求参数设置为Action属性
2.staticParams拦截器:
-将配置文件中action元素的子元素param参数设置为Action属性
3.servletConfig拦截器:
-将源于Servlet API的各种对象注入到Action,必须实现对应接口
4.fileUpload拦截器:
-对文件上传提供支持,将文件和元素设置到对应的Action属性,实际上内部依然使用了Commons-FileUpload组件。
5.exception拦截器:
-捕获异常,并且将异常映射到用户自定义的错误页面
6.validation拦截器:
-调用验证框架进行数据验证 更多的拦截器可在struts2-core包的struts-default.xml中查看
默认拦截器栈:
<!-- 为Action显示引用拦截器后,默认的拦截器defaultStack不再生效,需要手工引用。而且从顺序角度去讲,最好把默认的拦截器写在自定义拦截器上面 -->
<interceptor-ref name="defaultStack"></interceptor-ref>

四、使用拦截器实现权限控制

下面是4个开发模式常用配置的简介---
    <!-- 开启使用开发模式,详细错误提示 -->
<constant name="struts.devMode" value="true"/>
<!-- 指定每次请求到达,重新加载资源文件 -->
<constant name="struts.i18n.reload" value="true"/>
<!-- 指定每次配置文件更改后,自动重新加载 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 指定XSLT Result使用样式表缓存 -->
<constant name="struts.xslt.nocache" value="true"/>

相关代码:
@struts.xml
<struts>
<package name="default" extends="struts-default" namespace="/"> <!-- 注册拦截器 -->
<!-- Ps:拦截器栈内的拦截器(除了默认拦截器)的name要与拦截器栈外的拦截器要一致,因为引用拦截器栈的时候,里面的拦截器是从外面的拦截器中的class引用的 -->
<interceptors>
<interceptor name="AuthI" class="com.imooc.interceptor.AuthInterceptor"></interceptor>
<!-- 自定义拦截器mystack:组合了defaultStack和AuthI -->
<interceptor-stack name="mystack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="AuthI"></interceptor-ref>
</interceptor-stack>
</interceptors> <!-- 通过此Action访问后台管理页面,需要判断用户是否已登录,如果未登录则跳转到登录页面 -->
<action name="Auth">
<result>/WEB-INF/page/manager.jsp</result>
<result name="login">/login.jsp</result>
<!-- 引用自定义的拦截器 -->
<interceptor-ref name="mystack"></interceptor-ref>
</action> <action name="Login" class="com.imooc.action.LoginAction" method="login">
<result>/WEB-INF/page/manager.jsp</result>
<result name="error">/login.jsp</result>
</action>
</package>
</struts>

最新文章

  1. Quartz.Net简单使用
  2. Java比C++好在哪儿?
  3. VMWare File Format Learning &amp;&amp; Use VHD File To Boot VMWare &amp;&amp; CoreOS Docker Configuration And Running
  4. ie7下 滚动条内容不动问题
  5. C4.5决策树算法概念学习
  6. poj 2599 A funny game 博弈论
  7. OpenJudge 2773 2726 2727 采药
  8. iOS基础 - 定时器
  9. Maven之(九)依赖关系
  10. spring exception
  11. 微信退款 - tp5
  12. Urozero Autumn 2016. BAPC 2016
  13. Scratch安装使用教程
  14. django的ORM
  15. 全国绿色计算大赛 模拟赛第一阶段(C++)第1关:求和
  16. 【Linux】DNS服务-BIND基础配置(二)
  17. Web基础 HTML CSS JS JQuery AJAX
  18. 解决initializing java tooling(1%)
  19. HDU4641_K-string
  20. uboot环境变量的设置(未完待续)

热门文章

  1. POJ2234 Matches Game 尼姆博弈 博弈论
  2. 【树形dp】Apple Tree
  3. BZOJ 1116 [POI2008]CLO(并查集)
  4. opensuse语言环境和中文输入法
  5. UVA 10163 - Storage Keepers(dp)
  6. 常用 U-boot命令详解
  7. 【mysql】更新“”空字符串为NULL
  8. 万里长征第二步——django个人博客(第五步 ——配置后台admin)
  9. 如何使用SQLMAP绕过WAF
  10. unity stuck when building