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. 【转】Android 中的 Service 全面总结

    1.Service的种类   按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另 ...

  2. mysql存储过程游标加计划任务事件调度器

    存储过程加事件调度器 -- 存储过程 (多个)游标的使用 临时表的使用(让执行时间从一个小时降低到5分钟)DELIMITER $$ DROP PROCEDURE IF EXISTS `eval_cal ...

  3. SQLSERVER 2012的多维数据库浏览 ,不能多维的显示

    网上搜索后发现,原来ssms2012不支持这种方式,要使用Excel的方式 参考地址:http://www.flybi.net/question/12567

  4. IsBackground对线程的重要作用

    要点: 1.当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的. 2.当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行 ...

  5. Android NDK 入门与实践

    NDK 是什么 NDK 全称 Native Development Kit,可以让您在 Android 应用中调用 C 或 C++ 代码的工具. NDK 好处 1.NDK 可以生成 .so 文件, 方 ...

  6. 【起航计划 003】2015 起航计划 Android APIDemo的魔鬼步伐 02 SimpleAdapter,ListActivity,PackageManager参考

    01 API Demos ApiDemos 详细介绍了Android平台主要的 API,android 5.0主要包括下图几个大类,涵盖了数百api示例:

  7. DVB数字电视常见信号指标解释

    1. 平均功率与峰值电平       峰值电平在模拟电视广播时用于表征频道信号电平强弱. 模拟电视信号是单极性.不对称的,即电视信号有一个固定黑色参考电平,比黑色亮的信号处在黑色电平线一边,同步脉冲处 ...

  8. HttpWebRequest Post请求webapi

    1.WebApi设置成Post请求在方法名加特性[HttpPost]或者方法名以Post开头如下截图: 2.使用(服务端要与客户端对应起来)[单一字符串方式]:注意:ContentType = &qu ...

  9. CRUD全栈式编程概述

    业务场景 CRUD,从数据驱动的角度几乎所有的的业务都是在做这样的事情.  几乎所有的操作都是在做对表的增删改查.  假设我们将数据库数据规个类:  分为基础/配置数据和业务/增长数据,或者说静态数据 ...

  10. 【洛谷4717】【模板】快速沃尔什变换(FWT模板)

    点此看题面 大致题意: 有两个长度为\(2^n\)的数组\(A,B\),且\(C_i=\sum_{j⊕k==i}A_jB_k\)分别求出当\(⊕\)为\(or,and,xor\)时的\(C\)数组. ...