一、Struts2内置拦截器

Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性。这些内置的拦截器在struts-default.xml中配置。只有配置了拦截器,拦截器才可以正常的工作和运行。Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。大家可以至struts2的jar包内的struts-default.xml查看关于默认的拦截器与 拦截器链的配置。内置拦截器虽然在struts2中都定义了,但是并不是都起作用的。因为并不是所有拦截器都被加到默认拦截器栈里了,只有被添加到默认拦 截器栈里的拦截器才起作用,看一下被加到默认拦截器栈的拦截器都有那些:
五.开发自定义的拦截器步骤

虽然,Struts
2为我们提供如此丰富的拦截器实现,但是在某种情况下并不能满足我们的需求,比如:访问控制的时候,在用户每次访问某个action时,我们要去校验用户
是否已经登入,如果没有登入我们将在action执行之前就被拦截,此时我们就需要自定义拦截器;下面我们具体看一下,如何实现自定义拦截器。

1.实现拦截器类

所有的Struts
2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。
该接口提供了三

个方法:

1)    
void
init();在该拦截器被初始化之后,在该拦截器执行拦截之前,系统回调该方法。对于每个拦截器而言,此方法只执行一次。

2)    
void destroy();该方法跟init()方法对应。在拦截器实例被销毁之前,系统将回调该方法。

3)    
String intercept(ActionInvocation invocation) throws
Exception;该方法是用户需要实现的拦截动作。该方法会返回一个字符串作为逻辑视图。

除此之外,继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor是更简单的一种实现拦截器类的方式,
为此类提供了init()和destroy()方法的空实现,这样我们只需要实现intercept方法。还有一种实现拦截器的方法是继承
MethodFilterInterceptor类,实现这个类可以实现局部拦截,即可以实现指定拦截某一个action的哪个方法,或者不拦截哪个方法

2.注册自定义拦截器

自定义拦截器类实现了,现在就要在struts.xml里注册这个拦截器;

1).注册拦截器,在struts.xml中的package节点下注册拦截器

<interceptors>

<!-- name:拦截器的名称,class:自定义拦截器的类
-->

<interceptorname="拦截器名称"class="自定义拦截器的class路径"/>

</interceptors>

2).使用拦截器,在需要使用自定义拦截器的action中定义如下代码

<action>

<interceptor-refname="拦截器名称"/>

</action>
注意:因为struts2的很多功能都是根据Struts2默认拦截器栈实现的;如果此处只使用自定义的拦截器时,将失去struts2的很多核心功能;所以需要定义一个拦截器栈(由一个或多个拦截器组成)即此拦截器栈中一定要包括<interceptor-ref
name="defaultStack"/>!!!!即如下:

3) 
拦截器栈
<interceptor-stack
name="拦截器栈的名称">

<!--需要注意的是:系统默认的拦截器栈应要放在前面,在加入自定义拦截器;
-->

<interceptor-ref
name="defaultState"/>

<interceptor-ref
name="自定义拦截器的名称"/>
</interceptor-stack>
4)  在action中使用栈
<action>

<interceptor-refname="栈名称或拦截器名称"/>

。。。。。

</action>
5)
如果此时需要所有的action都使用自定义拦截器或者拦截器栈时,此时就定义一个默认的拦截器或者拦截器栈,即全局的拦截器。

在<default-interceptor-ref
name="permissionStack"/>

注意:如果在某个action中又使用了另一个拦截器,此时默认的拦截器将失效,为了确保能够使用默认的拦截器(包含Struts2的默认拦截器),又需要添加其他拦截器时,可以在action中加上其他拦截器

下面咱就以继承MethodFilterInterceptor类(它是AbstractInterceptor的子类)来实现一个权限控制的拦截器,别的页面都不展示了,在此,展示出拦截器类和struts.xml的配置:

拦截器类AuthorInterceptor:

package com.bzu.intecepter;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionInvocation;

import
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class AuthorInterceptor extends MethodFilterInterceptor
{

@Override

protected String doIntercept(ActionInvocation invocation) throws
Exception {

// TODO Auto-generated method stub

ActionContext context = invocation.getInvocationContext();

// 通过ActionContext来获取httpRequest

HttpServletRequest request = (HttpServletRequest) context

.get(StrutsStatics.HTTP_REQUEST);

// 也可以通过ServletActionContext来获取httpRequest

// HttpServletRequest request =
ServletActionContext.getRequest();

// 取得根目录的绝对路径

String currentURL = request.getRequestURI();

// 截取到访问的相对路径,可以通过这个和权限表比较来进行相应的权限控制

String targetURL = currentURL.substring(currentURL.indexOf("/",
1),

currentURL.length());

System.out.println(currentURL + ".............." +
targetURL);

// 通过ActionContext获取session的信息,以Map形式返回

Map session = context.getSession();

// 获取容器里面的username值,如果存在说明该用户已经登录,让他执行操作,如果未登录让他进行登录

String username = (String) session.get("username");

System.out.println(username+"username");

if (username != null) {

invocation.invoke();

}

return "login";
}
}

下面来看一下具体的struts.xml的配置:

<!DOCTYPE struts
PUBLIC

"-//Apache
Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.i18n.encoding" value="utf-8"
/>
<package name="struts2"
extends="struts-default">
<interceptors>

<!-- 配置未登录进行操作的拦截器 -->

<interceptor
name="loginInterceptor"
class="com.bzu.intecepter.AuthorInterceptor">

<param
name="excludeMethods">login</param>

</interceptor>

<!-- 重新封装一个默认的拦截器栈 -->

        
<interceptor-stack
name="myDefaultStack">

<interceptor-ref name="loginInterceptor"
/>

<interceptor-ref name="defaultStack"
/>

</interceptor-stack>

</interceptors>

<!-- 为这个包设置默认的拦截器栈 -->

    
<default-interceptor-ref name="myDefaultStack"
/>

<global-results>

<result
name="login">/login.jsp</result>

</global-results>

<action name="LoginAction"
class="com.bzu.action.LoginAction" method="login"
>

<result
name="success">success.jsp</result>

<result
name="fail">fail.jsp</result>

<result
name="input">login.jsp</result>

</action>

</package>

</struts>

struts2内置拦截器和自定义拦截器详解(附源码)的更多相关文章

  1. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)

    场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...

  2. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  3. [转]SpringMVC拦截器详解[附带源码分析]

      目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  4. SpringMVC拦截器详解[附带源码分析](转)

    本文转自http://www.cnblogs.com/fangjian0423/p/springMVC-interceptor.html 感谢作者 目录 前言 重要接口及类介绍 源码分析 拦截器的配置 ...

  5. SpringBoot内置的各种Starter是怎样构建的?--SpringBoot源码(六)

    注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 温故而知新 本篇接 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五) 温 ...

  6. SpringBoot内置生命周期事件详解 SpringBoot源码(十)

    SpringBoot中文注释项目Github地址: https://github.com/yuanmabiji/spring-boot-2.1.0.RELEASE 本篇接 SpringBoot事件监听 ...

  7. 2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

    收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Coll ...

  8. Nginx内置变量以及日志格式变量参数详解

    $args #请求中的参数值 $query_string #同 $args $arg_NAME #GET请求中NAME的值 $is_args #如果请求中有参数,值为"?",否则为 ...

  9. struts2(五)之struts2拦截器与自定义拦截器

    前言 前面介绍了struts2的输入验证,如果让我自己选的话,肯定是选择xml配置校验的方法,因为,能使用struts2中的一些校验规则,就无需自己编写了, 不过到后面应该都有其他更方便的校验方法,而 ...

随机推荐

  1. Flink 靠什么征服饿了么工程师?

    Flink 靠什么征服饿了么工程师? 2018-08-13    易伟平 阿里妹导读:本文将为大家展示饿了么大数据平台在实时计算方面所做的工作,以及计算引擎的演变之路,你可以借此了解Storm.Spa ...

  2. OpenRISC自定义指令GCC修改

    This short tutorial shows how to use the custom instructions defined by OpenRISC architecture. The O ...

  3. GPGPU OpenCL使用结构体数据

    OpenCL编程中可以使用结构体,只需要在核函数kernel中提供同样的结构体申明就可以啦. 如果在主函数中定义了结构体: typedef struct studentNode{ int age; f ...

  4. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  5. 为运行SQL Server的虚拟机切换装有DB Logs的最佳实践

    上一篇说到虚拟机启动不了, 原因是有一块VHDX的文件找不到了. 解决了这个问题之后, 又遇到了另一个问题, 那就是我的这台SQL Server的虚机启动之后, 我的几个重要database变成了su ...

  6. 如何获得Windows Server 2012上的FC的WWN

    我有一个测试环境, 一对Host与storage array之间既有iSCSI的连接, 也有FC的连接. 原来iSCSI的连接是OK的, 现在需要转用FC. 当在光纤交换机上划好了Zone之后, st ...

  7. python 安装whl文件

    对于安装whl格式的文件,首先要安装wheel包 利用 pip install wheel或下载再安装: 下载地址: https://pypi.python.org/pypi/wheel 解压后安装: ...

  8. ItermCF的MR并行实现

    ItermCF的MR并行实现 @(Hadoop) ItermCF的基本思想 基于物品相似度的协同过滤推荐的思想大致可分为两部分: 1.计算物与物之前的相似度 2.根据用户的行为历史,给出和历史列表中的 ...

  9. Logon database Tiger引起DataGuard不同步问题

    当DataGuard升级CPU后.发现主备库不能同步了,日志报错,所以在主库的运行的升级的后脚本"@catbundle.sql cpu apply"不能同步到备库 现象: brok ...

  10. C++ 生成

    1.重新生成,会导致所有cpp文件重新编译,然后连接. 2.使用生成,只会对需要重新编译的cpp文件,进行编译. a.修改cpp文件方法实现,只需要重新编译该cpp文件 b.修改h文件的接口部分,包含 ...