【Struts2】拦截器
一、概述
- 介绍拦截器:
- struts2拦截器使用的是AOP(面向切面编程)思想。AOP的底层实现就是动态代理。拦截器采用责任链模式 ,在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。责任链每一个节点,都可以继续调用下一个节点,也可以阻止流程继续执行。struts2中在
struts-default.xml文件中声明了所有的拦截器。而struts2框架默认使用的是defaultStack这个拦截器栈。在这个拦截器栈中使用了18个拦截器。简单说,struts2框架在默认情况下,加载了18个拦截器。可以通过使用拦截器进行控制action的访问。例如,权限操作
二、在Struts2中使用拦截器
2.1 步骤
1.创建一个Interceptor 可以自定义一个类实现
com.opensymphony.xwork2.interceptor.Interceptor- 在这个接口中有三个方法 init destroy intercept, intercept方法是真正拦截的方法。
- 在intercept方法中如果要向下继续执行,通过其参数ActionInvocation调用它的invoke()方法就可以。
2.声明一个Interceptor
- 参考
struts-default.xml文件中配置,在struts.xml文件中要自己声明一个interceptor
- 参考
3.在action中指定使用哪些拦截器.
- 注意:只要显示声明使用了一个拦截器。那么默认的拦截器就不在加载。
2.2 分析拦截器原理
源代码执行流程:
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中就是通过递归完成所有的拦截调用操作.
2.3 关于interceptor与Filter区别:
- 1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
- 2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
- 3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
- 4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
- 5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
三、案例
- 权限控制:
- 1.login.jsp------>LoginAction------------->book.jsp,登录成功,将用户存储到session。
- 2.在book.jsp中提供crud链接。每一个连接访问一个BookAction中一个方法。
- 要求:对于BookAction中的add,update,delete方法要求用户必须登录后才可以访问。search无要求。
要控制action中某些方法的拦截
1.创建类不在实现Interceptor接口,而是继承其下的一个子类.MethodFilterInterceptor,不用在重写intercept方法,而是重写 doIntercept方法。
public class BookInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
// 1.得到session中的user
User user = (User) ServletActionContext.getRequest().getSession()
.getAttribute("user");
if (user == null) {
BookAction action = (BookAction) invocation.getAction(); // 得到当前拦截的action对象。
action.addActionError("权限不足,请先登录");// 存储错误信息
return Action.LOGIN;
}
return invocation.invoke();
}
}
- 2.在struts.xml文件中声明
<interceptors>
<intercept name="" class="">
<param name="includeMethods">add,update,delete</param>
<param name="excludeMethods">search</param>
</intercept>
</interceptors>
【Struts2】拦截器的更多相关文章
- Struts2 拦截器配置以及实现
@(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...
- struts2 拦截器
拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...
- Struts2拦截器的使用 (详解)
Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...
- struts2拦截器
一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...
- Struts2拦截器模拟
前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...
- Struts2拦截器初涉
Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...
- 浅谈Struts2拦截器的原理与实现
拦截器与过滤器 拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...
- 基于SSH2框架Struts2拦截器的登录验证实现(转)
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
- struts2拦截器interceptor的三种配置方法
1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...
- Struts2拦截器原理以及实例
一.Struts2拦截器定义 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...
随机推荐
- linux简单命令6---挂载
- spring 使用@Valid校验数据出错DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod - Failed to resolve argument 0 of type
问题原因:在 @Valid 的那个参数后面紧跟着一个 BindingResult 的参数(一定要紧跟着) 参考来源:https://segmentfault.com/q/101000000838468 ...
- spring mvc 返回JSON数据
servlet相关XML配置 <!--这个不启用会报错--><mvc:annotation-driven /> <bean class="org.springf ...
- Day04:循环结构(while、do-while、for)
Java 循环结构 - while ,do...while,for 反复执行一段相同或相似代码的格式. 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java ...
- 集群架构01.Nginx初步安装配置
1.切换163yum 源,环境介绍 [root@moban ~]# cat /etc/redhat-release CentOS release 6.5 (Final) mv CentOS-Base. ...
- ffmpeg学习笔记-音频解码
在之前的文章已经初步对视频解码有个初步的认识了,接下来来看一看音频解码 音频解码步骤 音频解码与视频解码一样,有者固有的步骤,只要按照步骤来,就能顺利的解码音频 以上是ffmpeg的解码流程图,可以看 ...
- solr后台操作Documents之增删改查
偶尔会用到solr后台操作一些数据,比如测试等一些情况.但具体用的时候可能会忘记,或者搜的时候结果不全,在此略详细的记一下. 1.添加 {"id":6,"title&qu ...
- Mybatis插件之Mybatis-Plus的CRUD方法
使用Mybatis-plus进行基本的CRUD(增查改删)操作. 实体类(User)代码: import com.baomidou.mybatisplus.annotation.IdType; imp ...
- Python if __name__ == '__main__': 理解
if __name__ == '__main__':是为了区分.py文件是自己直接被执行还是被其他文件调用. 当.py文件直接被执行时,默认的是 __name__ = '__main__',因此条件成 ...
- storm manual drpc 的远程调用
一.创建server端 public class ManualDRPC { private static final Logger LOG = LoggerFactory.getLogger(Manu ...