struts2学习笔记 -- day09 Struts2的拦截器
来源:互联网 发布:毛笔书法软件下载 编辑:程序博客网 时间:2024/05/19 09:12
一、Struts2中的拦截器
1、什么是struts2的拦截器
拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者在定义的action执行的前后加入执行的代码,也可以在一个action执行前阻止其执行。也就是说它提供了一种可以提取action中可重用代码,统一管理和执行的方式。
拦截器链 (Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
2、过滤器和拦截器的区别
过滤器是servlet规范中的一部分,任何java web工程都可以使用。
拦截器是struts2框架自己的,只有使用了struts2框架的工程才能用。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。
拦截器它是只有进入struts2核心内部之后,才会起作用,如果访问的是jsp,html,css,image或者js是不会进行拦截的。
3、拦截器的作用
Struts2中的很多功能都是由拦截器完成的。struts2配置文件中有一个名称为struts-default.xml的配置文件,该配置文件中有struts2框架给我们提供的很多拦截器。比如:servletConfig,staticParam,params,modelDriven等等。我们通过实现接口方式获取ServletAPI以及模型驱动封装请求参数,都是拦截器在帮我们做。
4、拦截器的执行时机
在访问struts2核心内部时,在动作方法执行之前先正序执行,然后执行动作方法,执行完动作方法和结果视图之后,再倒序执行。所以它是先进后出,是个栈的结构。具体可参考下图:
5、拦截器的类视图
下图为拦截器的类结构视图
二、自定义拦截器
1、编写自定义拦截器的方式
第一种:定义一个类,实现Interceptor接口
第二种:定义一个类,继承AbstractInterceptor
第三种:定义一个类,继承MethodFilterInterceptor -- 常用
2、使用方式二编写自定义拦截器的步骤
(1)、编写一个类,继承AbstractInterceptor
package cn.itcast.interceptor;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/** * 自定义拦截器类* @Description: TODO * @date 2017年8月11日 下午8:14:00 * @version V1.0 */public class CheckLoginInterceptor extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation invocation) throws Exception {Object user = ServletActionContext.getRequest().getSession().getAttribute("user");if(user == null){return "login";}//放行操作return invocation.invoke();}}
(2)、在struts2配置文件中声明并引用拦截器
<struts><package namespace="/user" name="struts2" extends="struts-default"><!-- 声明拦截器 --><interceptors><interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor></interceptors><action name="custAction" class="cn.itcast.web.UserAction" method="value"><!-- 动作类中引用拦截器注意:如果不引用自定义拦截器,拦截器栈就会起作用,但此处如果引用了自定义拦截器,默认的拦截器栈就会失效,需要配置默认拦截器栈 --><interceptor-ref name="checkLogin"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref><result name="success">/success.jsp</result></action></package></struts>
3、抽取默认拦截器栈
<struts><package namespace="/user" name="struts2" extends="struts-default"><!-- 声明拦截器 --><interceptors><interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor><!-- 声明拦截器栈 --><interceptor-stack name="myDefaultStack"><!-- 引用自定义的拦截器 --><interceptor-ref name="checkLogin" /><!-- 引用默认拦截器 --><interceptor-ref name="defaultStack" /></interceptor-stack></interceptors><!-- 将自定义的拦截器栈替换默认的拦截器栈 --><default-interceptor-ref name="myDefaultStack" /><action name="custAction" class="cn.itcast.web.UserAction" method="value"><!-- 动作类中引用拦截器注意:如果不引用自定义拦截器,拦截器栈就会起作用,但此处如果引用了自定义拦截器,默认的拦截器栈就会失效,需要配置默认拦截器栈 --><result name="success">/success.jsp</result></action></package></struts>
注意:将默认的拦截器栈替换为自定义的拦截器栈,此时所有方法都进行拦截,但有些方法我们不需要拦截,应该怎么配置?配置如下
4、使用第三种拦截方式,并且配置默认放行或拦截的方法
动作类
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/** * 自定义拦截器类,第三种* @Description: TODO * @date 2017年8月11日 下午8:14:00 * @version V1.0 */public class CheckLoginInterceptor extends MethodFilterInterceptor {@Overridepublic String doIntercept(ActionInvocation invocation) throws Exception {Object user = ServletActionContext.getRequest().getSession().getAttribute("user");if(user == null){return "login";}//放行操作return invocation.invoke();}}
struts.xml配置
<!-- 声明拦截器 --><interceptors><interceptor name="checkLogin" class="cn.itcast.interceptor.CheckLoginInterceptor"></interceptor><!-- 声明拦截器栈 --><interceptor-stack name="myDefaultStack"><!-- 引用自定义的拦截器 --><interceptor-ref name="checkLogin" ><!-- 此处配置默认拦截或者不拦截的方法name:excludeMethods 指的是默认不拦截的方法 includeMethods 指的是默认拦截的方法后面的取值是动作类中的方法名称,可以写多个,之间用 "," 号隔开 --><param name="excludeMethods">login,logout</param></interceptor-ref><!-- 引用默认拦截器 --><interceptor-ref name="defaultStack" /></interceptor-stack></interceptors><!-- 将自定义的拦截器栈替换默认的拦截器栈 --><default-interceptor-ref name="myDefaultStack" />
- struts2学习笔记 -- day09 Struts2的拦截器
- Struts2学习笔记11:Struts2的拦截器
- Struts2学习笔记11:Struts2的拦截器
- Struts2学习笔记12:Struts2的拦截器【续】
- Struts2学习笔记(八)Struts2的拦截器
- 拦截器---struts2学习笔记
- struts2 学习笔记拦截器
- struts2学习笔记-----拦截器
- struts2系列学习笔记(11)---------------拦截器
- struts2学习笔记之拦截器(Interceptor)
- Struts2拦截器Interceptor学习笔记
- Struts2学习笔记之自定义拦截器
- struts2学习笔记拦截器实现原理
- Struts2学习笔记之自定义拦截器
- struts2学习笔记(九)拦截器
- struts2 拦截器学习笔记01
- struts2学习笔记之拦截器(Interceptor)
- Struts2学习笔记五(拦截器)
- Git提交错误后如何回退
- struts2学习笔记 -- day08 Struts2中使用EL表达式
- 【STL】hdu 5688 Problem D
- Linux设置mysql 表明区分大小写
- Python一些库的安装
- struts2学习笔记 -- day09 Struts2的拦截器
- 立方和
- struts2学习笔记 -- day10 Struts2中的注解
- Android Studio程序无法加载到虚拟机解决方法
- 51nod 1475 建设国家
- tomcat下jndi的三种配置方式
- 编程思想——第三章控制流程
- flex布局学习笔记
- poj1177 Picture 离散 注意排序