一、概述

  • 介绍拦截器:
  • 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方法中:

  1. if (interceptors.hasNext()) {//判断是否有下一个拦截器.
  2. final InterceptorMapping interceptor = interceptors.next(); //得到一个拦截器
  3. String interceptorMsg = "interceptor: " + interceptor.getName();
  4. UtilTimerStack.push(interceptorMsg);
  5. try {
  6. resultCode = interceptor.getInterceptor().intercept(DefaultActionInvocation.this);
  7. //调用得到的拦截器的拦截方法.将本类对象传递到了拦截器中。
  8. }
  9. finally {
  10. UtilTimerStack.pop(interceptorMsg);
  11. }
  12. }
  • 通过源代码分析,发现在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方法。

  1. public class BookInterceptor extends MethodFilterInterceptor {
  2. @Override
  3. protected String doIntercept(ActionInvocation invocation) throws Exception {
  4. // 1.得到session中的user
  5. User user = (User) ServletActionContext.getRequest().getSession()
  6. .getAttribute("user");
  7. if (user == null) {
  8. BookAction action = (BookAction) invocation.getAction(); // 得到当前拦截的action对象。
  9. action.addActionError("权限不足,请先登录");// 存储错误信息
  10. return Action.LOGIN;
  11. }
  12. return invocation.invoke();
  13. }
  14. }
  • 2.在struts.xml文件中声明
  1. <interceptors>
  2. <intercept name="" class="">
  3. <param name="includeMethods">add,update,delete</param>
  4. <param name="excludeMethods">search</param>
  5. </intercept>
  6. </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. jemter 90%line的解释

    假如: 有10个数: 1.2.3.4.5.6.7.8.9.10    按由大到小将其排列. 求它的第90%百分位,也就是第9个数刚好是9 ,那么他的90%Line 就是9 . 另一组数: 2.2.1. ...

  2. TreeView如何实现选中的节点上移或下移 [问题点数:20分,结帖人nww2002]

    在TreeView中,如何实现选中一节点,右键点击上移或下移 TTreeNode.MoveTo() 一.获得Tree上的结点var NowNode : TTreeNode;begin  NowNode ...

  3. Canal——写入到ES中数据错乱

    问题描述 使用canal-adapter写入elasticSearch数据时,数据是写入了elasticSearch了,但出现了mysql表中的数据和elasticSearch中索引中的数据错乱的问题 ...

  4. kubernetes 之kubelet客户端证书过期问题处理 KubeClientCertificateExpiration apiserver (monitoring/k8s warning) Kubernetes API certificate is expiring in less than 7 days.

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAB4gAAAKMCAYAAAAZj+XuAAABfGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYG ...

  5. 安装完 MySQL 后必须调整的 10 项配置(转)

    当我们被人雇来监测MySQL性能时,人们希望我们能够检视一下MySQL配置然后给出一些提高建议.许多人在事后都非常惊讶,因为我们建议他们仅仅改动几个设置,即使是这里有好几百个配置项.这篇文章的目的在于 ...

  6. mysql表如何使用redis保存?

    mysql表: userid username password email 9 Lisi 111111 lisi@163.com 对应redis存储: 127.0.0.1:6379> set ...

  7. Flutter之ExpansionTile组件

    ExpansionTile组件 ExpansionTile Widget就是一个可以展开闭合的组件,常用的属性有如下几个. title:闭合时显示的标题,这个部分经常使用Text Widget. le ...

  8. MySQL之LEFT JOIN中使用ON和WHRERE对表数据

    背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论.商城里一个货物有多少评论.一条评论有多少个赞等等.但是由于对join.on.where等关键字的不 ...

  9. Tomcat 部署方式

    显示 部署 1.添加context元素方式(server.xml) <Host appBase="webapps" autoDeploy="true" n ...

  10. 使用注解和xml两种方式整合Activemq与spring(gradle工程)

    一.新建gradle工程 1.1 使用intellij新建gradle工程步骤省略 二.导入依赖,配置build.gradle plugins { id 'java' } group 'com.bdh ...