一、概述

  • 介绍拦截器:
  • 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】拦截器的更多相关文章

  1. Struts2 拦截器配置以及实现

    @(Java ThirdParty)[Struts|Interceptor] Struts2 拦截器配置以及实现 Struts2的拦截器应用于Action,可以在执行Action的方法之前,之后或者两 ...

  2. struts2 拦截器

    拦截器:对Action的访问.可以拦截到Action中某个方法.与过滤器不同,过滤器过滤的是请求.过滤JSP.html.但是拦截器不能拦截jsp.html的访问. Struts2 拦截器在访问某个 A ...

  3. Struts2拦截器的使用 (详解)

    Struts2拦截器的使用 (详解) 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈default ...

  4. struts2拦截器

    一.自定义拦截器 struts2拦截器类似于servlet过滤器 首先定义一个拦截器这个拦截器实现了Interceptor接口: package cn.orlion.interceptor; impo ...

  5. Struts2拦截器模拟

    前言: 接触Struts2已经有一段时间,Student核心内容就是通过拦截器对接Action,实现View层的控制跳转.本文根据自身理解对Struts2进行一个Java实例的模拟,方便大家理解! 示 ...

  6. Struts2拦截器初涉

    Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...

  7. 浅谈Struts2拦截器的原理与实现

    拦截器与过滤器           拦截器是对调用的Action起作用,它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了 ...

  8. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  9. struts2拦截器interceptor的三种配置方法

    1.struts2拦截器interceptor的三种配置方法 方法1. 普通配置法 <struts> <package name="struts2" extend ...

  10. Struts2拦截器原理以及实例

    一.Struts2拦截器定义 1. Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 2. ...

随机推荐

  1. Maven打包将依赖的jar一同打进去

    在pom.xml文件中添加: <build> <plugins> <plugin> <artifactId>maven-assembly-plugin& ...

  2. 阿里巴巴java规则p3c结合sonar使用

    sonar插件位置: jar包放至$SONAR_HOME/extensions/plugins下,重启sonar即可 如何在sonarqube的pmd插件中整合阿里开发规范 alibaba p3c s ...

  3. 【ABAP系列】ABAP CL_ABAP_CONV_IN_CE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]ABAP CL_ABAP_CON ...

  4. 解决Linux:Too many levels of symbolic links

    Too many levels of symbolic links 解决:创建链接时使用绝对路径

  5. 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速

    这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...

  6. idea查看源码没有注释的问题

    进入idea的设置 勾选这两个 然后重新导入 页面的右上角有个下载download source的提示,点击下载即可 然后页面就要源码注释了

  7. [Agc029E]Wandering TKHS_树形dp_树上差分

    Wandering TKHS 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_e 数据范围:略. 题解: 好神啊 Orz司队 https:// ...

  8. Spring mybatis源码篇章-Mybatis主文件加载

    通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-SqlSessionFactory 前话 本文承接前文的内容继续往下扩展,通过Spring与Mybatis的 ...

  9. #【Python】【基础知识】【模块】【Python的常用模块】

    在IDE解释器中,执行help('modules')可查看当前环境可调用的Python模块: >>> help('modules') Please wait a moment whi ...

  10. [转帖]centos7上设置中文字符集

    centos7上设置中文字符集 https://www.cnblogs.com/kaishirenshi/p/10528034.html author: headsen  chen date: 201 ...