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. Jetty数据同步使用

    1. Jetty简介 Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境.Jetty是使用Java语言编写的,它的API以一组JAR包的形 ...

  2. logback.xml日志文件过滤器配置简析

    自定义过滤器 java代码,目的是在mdc中放值,然后在日志中打印 package com.controller; import com.pojo.JsonData; import org.slf4j ...

  3. iOS 8 提供 TestFlight 方便开发者测试软件 (转)

    原文地址:http://tech2ipo.com/66893 TestFlight / via iMore 作者: Nick Arnott   译者:翛凌 原文:iMore  iOS 应用程序的测试对 ...

  4. codevs原创抄袭题 5960 信使

    题目描述 Description •战争时期,前线有n个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所. ...

  5. jQuery设置全选和全反选

    HTML 代码: <input type="checkbox" id="allChecked" onclick="setAllChecked(t ...

  6. canvas制作倒计时炫丽效果

    <!DOCTYPE html> <head> <title>canvas倒计时</title> <style> .canvas{ displ ...

  7. [转]C#利用委托跨线程更新UI数据

    在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态.比较好的方式是用委托实现, ...

  8. Android 通过接口的方式去调用服务里面的方法

    public class MainActivity extends AppCompatActivity { private MyConn conn; private Iservice myBinder ...

  9. SQL Server2005修改计算机名后不能发布订阅

    在一台安装有SQL Server2005的计算机上,更改计算机名后,在发布订阅的时候提示如下错误报告: 由于需要需要配置一个发布订阅,可是一直报告:" sql server 复制需要有实际的 ...

  10. centreon公司推出的check plugin pack

    文档 http://documentation.centreon.com/docs/centreon-plugins/en/latest/ (epel) # yum install nagios-pl ...