1、Struts2拦截器的体系结构

Struts2拦截器最大的特点是其透明性,即用户感觉不到它的存在,但我们在使用Struts2框架时,拦截器时时刻刻都在帮助我们处理很多事情。

包括:

 文件上传

 表单校验

 自动将预定义好的表单参数值封装给Action使用等

说明:

每一个Action请求都包装在一系列的拦截器内部。拦截器可以动态拦截Action。拦截器所提供的机制可以保证在执行一个Action的前后执行拦截器中的代码,也可以在一个Action执行前阻止其执行。

2、Struts2内建拦截器

Struts2内建了大量的拦截器,这些拦截器以name-class形式配置在struts-default.xml中。

 name是拦截器的名称,即以后使用该拦截器的唯一标识

 class则指定了该拦截器的实现类

如果我们定义的package继承了Struts2的默认struts-default包,则可以自行使用下面定义的拦截器。

<package name="hello" namespace="/" extends="struts-default">
<action name="HelloWorld" class="com.pxy.struts2.action.HelloWorld">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>

常见的struts2内建拦截器介绍见下表

在处理与系统逻辑相关的通用功能时,需要通过自定义拦截器来实现。

 如权限控制,日志记录

一、自定义基于类范围的拦截器

创建自定义拦截器步骤如下:

  1、创建类SimpleAction,继承于ActionSupport,定义operator方法,用于获取当前系统时间

public class SimpleAction extends ActionSupport{
public String operator(){
System.out.println("开始执行SimpleAction类的operator()时间为:"+DateTimeUtils.getStringDate(new Date()));
return "operator";
}
}

  2、创建拦截器类SimpleInterceptor,继承于AbstracInterceptor,该类用于对SimpleAction类进行拦截

public class SimpleInterceptor extends AbstractInterceptor{
public String intercept(ActionInvocation invocation) throws Exception {
//打印出在执行SimpleAction类之前执行拦截器的时间
System.out.println("在执行SimpleAction之前开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date())); //调用下一个拦截器,如果没有拦截器就调用匹配的Action
String result=invocation.invoke(); //该result是方法的返回值 本例中result=operator
//打印出在执行SimpleAction类之后执行拦截器的时间
System.out.println("在执行SimpleAction之后开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date()));
return result;
}
}

  3、在struts.xml文件中,配置SimpleAction和SimpleIntercept的相关信息

<interceptors>
<!-- 自定义拦截器 -->
<interceptor name="simple"class="包名.SimpleInterceptor"/>
</interceptors>
<!-- 需要拦截的Action -->
<action name="simple_*" class="包名.SimpleAction" method="{1}">
<result name="{1}">/success.jsp</result>
<interceptor-ref name="simple"/> <!-- 将拦截器别名为Simple的拦截器注给SimpleAction -->
<interceptor-ref name="defaultStack"/> <!-- 配置默认拦截器 -->
</action>

注意:如果为Action指定一个拦截器,则系统默认的拦截器就会失效,导致Struts2的很多功能无法使用。所以Action在指定了一个拦截器后,还需要将默认的拦截器注册给Action。Struts2默认拦截器的别名为defaultStack。

  4、浏览器输入:http://localhost:8080/项目名/simple_operator.action

二、方法拦截器

在上面的类拦截器中,我们可以在SimpleAction再定义一个方法query()方法,然后访问:http://localhost:8080/项目名/simple_query.action,即可对query方法拦截。

更细粒度的控制方法拦截,则需要进行如下的配置:

<interceptors>
<interceptor name="simple" class="包名.SimpleInterceptor" />
</interceptors>
<action name="simple_*" class="包名.SimpleAction" method="{1}">
  <interceptor-ref name="simple">
<!--includeMethods参数用于指明哪些方法需要拦截
如果拦截多个方法,则每个方法之间通过逗号“,”分隔
-->
  <param name="includeMethods">query</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />
</action>

并且拦截器类要继承MethodFilterInterceptor类,而不是继承AbstractInterceptor类,否则每个访问到的方法都会被自动拦截,达不到控制的目的。

public class SimpleInterceptor extends MethodFilterInterceptor{

    @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("进入拦截器");
//调用下一个拦截器
String result = invocation.invoke(); System.out.println("调用完拦截器"+"--result的值:"+result); return result;
}
}

常见的登录拦截操作如下:

@Override
public String intercept(ActionInvocation invocation) throws Exception {
  HttpSession session = ServletActionContext.getRequest().getSession();
Object account = session.getAttribute("account");
if(account != null){
return invocation.invoke();
}
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("err", "请登录后操作!");
return "login";
}

Struts2之类范围拦截器和方法拦截器的更多相关文章

  1. django 把函数装饰器变为方法装饰器

    暗暗啊

  2. typescript装饰器 方法装饰器 方法参数装饰器 装饰器的执行顺序

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  3. typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  4. struts2 参数注入 方法拦截器

    web.xml: <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi=" ...

  5. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  6. 从struts2拦截器到自定义拦截器

    拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.xml的配置中,package内直接或间接继承了struts-default.xml,这样st ...

  7. Struts2自定义拦截器Interceptor以及拦截器登录实例

    1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor ...

  8. Struts2之Action接收请求参数和拦截器

    技术分析之在Struts2框架中使用Servlet的API        1. 在Action类中也可以获取到Servlet一些常用的API        * 需求:提供JSP的表单页面的数据,在Ac ...

  9. JAVAEE——struts2_04:自定义拦截器、struts2标签、登陆功能和校验登陆拦截器的实现

    一.自定义拦截器 1.架构 2.拦截器创建 //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implemen ...

随机推荐

  1. DetachedCriteria用法

    http://uule.iteye.com/blog/947923转载 在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查 ...

  2. 关于docker remote api未授权访问漏洞的学习与研究

    漏洞介绍: 该未授权访问漏洞是因为docker remote api可以执行docker命令,从官方文档可以看出,该接口是目的是取代docker 命令界面,通过url操作docker. docker ...

  3. (转)Entity Framework4.1实现动态多条件查询、分页和排序

    原文:http://www.cnblogs.com/ahui/archive/2011/08/04/2127282.html EF通用的分页实现: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  4. jeecg3.8popup弹出窗口触发失去焦点事件,引发验证弹窗,影响体验问题的解决办法

    在初始化表单的代码中添加以下加粗部分,有几个popup就定义几个标志位,主要是防止第一次失去焦点时候的弹窗(此时还未来得及选择),提交表单的时候还是会正常校验的. //popup触发失去焦点事件,设置 ...

  5. maven课程 项目管理利器-maven 3-8 maven依赖传递 4星

    本节主要讲了 1 maven依赖传递 本地项目路径:F:\xiangmu3\Xin\FuQiang\maven\code 2 maven排除依赖 3 注意事项 4 零散知识点 1 maven依赖传递 ...

  6. POS开发问题 - 输入非数字弹出提示框的实现

    业务场景: 一个输入框,如果输入非数字,那么弹出提示框,如下图 点击确定,输入框自动清空非数字的输入,并且自动获得焦点,如图: 实现方案: 实现的想法: 给输入框添加一个 input 事件,给输入框绑 ...

  7. 安装BI Publisher Desktop报错:“Template Builder Installer Failed:Unexpected Error”

    原因:office的版本未安装正确,应该安装X86版本的,如果是X64的会出现,重新安装X86版本的office后解决问题.

  8. 用AutoHotkey一键打开、激活、或隐藏Chrome(或其他软件)

    热键的效果: 1.Chrome没打开时,打开Chrome 2.Chrome已打开,未激活时,则激活Chrome 3.Chrome已激活,则隐藏Chrome 本来这种功能对AutoHotkey来说非常简 ...

  9. PHP:如果正确加载js、css、images等静态文件

    日常中,我们想要把一些静态页面放在框架上或者是进行转移时,那么静态页面上的原url加载js.css.images都会失效,那么我们应该怎么进行修改捏? 现在仓鼠做个笔记哈 这里有几个注意项: 1.路径 ...

  10. 用户表单事件(focus事件)

    以前做用户系统的时候经常用到表单验证,正则表达式事件来处理和绑定事件和进行事件,这里说的其实只是一小部分,也不是很值得写,但是今天遇到了还是写一下,毕竟基础还是蛮重要的,就算懂的童鞋,巩固一下也是好的 ...