Struts 2 拦截器
什么是Struts 2 拦截器
拦截器就是当用户请求后台Action类时在Action的Excute()方法执行前和Result返回魔板试图之后(将页面(数据)发送给浏览器渲染之前)所需要的一些通用操作存放在拦截器中对数据进行拦截!
简单来说就是对请求和响应信息进行过滤,可以看做是Java EE中的过滤器,但是需要注意的是拦截器只能对Action类的请求进行拦截若直接请求jsp文件、Css样式等静态文件拦截器是无法进行过滤的!
为什么要使用拦截器
任何优秀的MVC框架都会提供一些通用的操作,如请求数据的封装、类型转换、数据校验、解析上传的表单、防止表单的多次提交等。而早期的MVC框架中,这些通用的操作都写死在核心控制器中,然而并不是所用的请求都需要这些操作的实现,于是就导致了框架的灵活性差、可扩展性低等问题。
Struts2将它的核心功能放到拦截器而不是集中在核心控制器中实现,把大部分控制器需要完成的工作按功能分开定义,每个拦截器只完成一个功能,而完成这些功能的拦截器可以自由选择,灵活组合,需要哪些功能只需要在配置文件中进行添加即可,从而提高了框架的灵活性。
拦截器的工作原理
Struts2拦截器围绕Action和Result的执行而执行。其实现原理和Servlet Filter差不多,以链式执行,对真正要执行的方法(execute())进行拦截。首先执行Action配置的拦截器,在Action和Result执行之后,拦截器在一次执行(与先前的执行顺序相反),在此以链式的执行过程中,任何一个拦截器都可以直接返回,从而终止余下的拦截器、Action及Result的执行。
当ActionInvocation的invoke()方法被调用时,开始执行Action配置的第一个拦截器,拦截器作出相应的处理后会在此调用ActionInvocation的invoke()方法,ActionInvocation对象负责跟踪执行过程的状态,并且把控制权交给合适的拦截器。ActionInvocation通过调用拦截器的intercept()方法将控制转交给拦截器。因此,拦截器的执行过程可以看做是一个递归的过程,后续拦截器继续执行,直到最后一个拦截器,invoke()方法会执行Action的execut()方法。
先面以一张图来描述拦截器的执行过程
Struts2的内值拦截器
Struts2提供了一些默认的内值拦截器。如下所示:
<!--拦截器栈(可以存放一堆拦截器,在调用时只需调用defaultStack就可以调用其中的所有拦截器)-->
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/><!--用于捕获异常,并根据类型将异常映射到用户自定义的错误页面-->
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/><!--将源于Servlet API的各种对象注入 Action当中-->
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/><!--将文件和元数据从多重请求转换为常规的请求数据,以便能将他们设置在队形的Action属性中-->
<interceptor-ref name="checkbox"/>
<interceptor-ref name="datetime"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/><!--将在配置文件中通过action的子元素param设置的参数设置到对应的Action属性中-->
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/><!--将请求中的数据设置到Action中的属性上-->
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation"><!--用于数据校验-->
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow"><!--用于数据校验错误时终止执行流程-->
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="debugging"/>
<interceptor-ref name="deprecation"/>
</interceptor-stack>
自定义拦截器
介绍了那么多的原理,现在我们来自己编写一个拦截器来体验一下吧。下面来说一下我们这个例子的功能。首先当用户访问我们的网站时使用拦截器判断其是否已经登录,如果没有登录则跳转到登录页面进行登录如图所示:
如果是已经登录的用户则直接跳转到欢迎界面,如图所示:
关于页面的html和登录的验证代码这里就不在进行展示了,我们主要看一下关于拦截器的代码,首先我们要定义一个拦截器类(该类实现com.opensymphony.xwork2.interceptor.Interceptor 接口)。其代码如下:
package cn.wz.logindemo;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.Interceptor;
public class Myinterceptor implements Interceptor {
/***
*/
private static final long serialVersionUID = 1L;
/**
* 实现Interceptor接口的intercept()方法,该方法进行拦截操作,
*/
public String intercept(ActionInvocation invoc) throws Exception {
ActionContext context = invoc.getInvocationContext();//获取Action上下文对象
Map<String, Object> map = context.getSession();//通过Action上下文获取Session对象的集合(Session实质上就是封装了一个map集合,通过getSession()方法来以解耦的方式获取Session)
boolean falg = map.containsKey("userName");//判断用户是否已经登录
if (falg) {
//如果已经登录则将控制权转交给其它的拦截器或Action
return invoc.invoke();
}//如果没有登录则返回“input”不再执行其他拦截器或Action直接跳转到登录页面
return "input";
}
/**
* 实现Interceptor接口的destory()方法,该方法只在该拦截器销毁时调用一次
*/
public void destroy() {
}/**
* 实现Interceptor接口的init方法,该方法只在该拦截器初始化时调用一次
*/
public void init() {
}}
然后在Struts.xml文件中对拦截器进行如下配置:
Struts 2 拦截器的更多相关文章
- Struts的拦截器
Struts的拦截器 1.什么是拦截器 Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所 ...
- struts自定义拦截器配置
配置自己的拦截器可以先参照下系统的拦截器是怎么配置的,首先打开struts-default.xml搜索下interceptor:系统里的拦截器有很多,拦截器都是放在堆栈里的,系统引用的是默认堆栈, & ...
- struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货
一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...
- struts自定义拦截器
第01步:配置web.xml,启动struts框架 <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- (转)关于Struts 2 拦截器参数丢失问题
from:http://www.cnblogs.com/huzx/archive/2011/06/09/2076328.html 今天在做用户的登陆认证的时候出现的问题. 在传参数的时候,发现参数丢失 ...
- struts之拦截器
拦截器是为了让一些自己不希望发生的事情进行预防.以下我说一下struts自己定义拦截器. 以下我贴下struts.xml里的自定义的拦截器: <package name="my&quo ...
- Struts加入拦截器后取不到页面参数
在Struts2的demo项目中添加了一个简单的拦截器,突然发现,Action中取不到页面的参数了 这也是很蛋疼的事情,还好这个比较简单,稍微一查就发现问题: Struts2中很多的功能是用拦截器实现 ...
- java struts学习-拦截器
引言: Struts2拦截器,每个拦截器类只有一个对象实例,即采用单例模式,所有引用这个拦截器的Action都共享这一拦截器类的实例,因此,在拦截器中如果使用类变量,要注意同步问题. • ...
- Struts自定义拦截器&拦截器工作原理
0.拦截器的调用原理: 拦截器是一个继承了序列化接口的普通接口.其工作原理是讲需要被拦截的对象作为参数传到intercept()方法内,在方法内部对此对象进行处理之后再执行原方法.intercept( ...
随机推荐
- Redis常用命令汇总
Redis HGET获取与字段中存储的键哈希相关联的值D:\web\JH2016\RedisV3.2\2MasterOpenAPI-15698\redis-cli.exe -h 127.0.0.1 - ...
- Idea的live template参数中的预定义功能
Predefined Functions to Use in Live Template Variables Item Description annotated("annotation q ...
- 【转】JAVA 接口
1.定义接口 使用interface来定义一个接口.接口定义同类的定义类似,也是分为接口的声明和接口体,其中接口体由常量定义和方法定义两部分组成.定义接口的基本格式如下: [修饰符] inter ...
- Linux下GCC和Makefile实例(从GCC的编译到Makefile的引入) 转
http://www.crazyant.net/2011/10/29/linux%E4%B8%8Bgcc%E5%92%8Cmakefile%E5%AE%9E%E4%BE%8B%EF%BC%88%E4% ...
- 直播技术资源站 http://lib.csdn.net/base/liveplay/structure
直播技术资源站 http://lib.csdn.net/base/liveplay/structure
- SVO实时全局光照优化(里程碑MK2):Sparse Voxel Octree based Global Illumination (SVO GI)
自主实现的实时渲染引擎,对标对象ue4/ce5,超越u3d/klayge.MK2版本侧重于质量与速度的均衡,以下上传示范均为实测截图,均为全分辨率(网页上显示缩小了)1080p/60fps.
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- LCLFramework框架之IOC
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 借助于"第三方"实现具有依赖关系的对象之间的解 ...
- Asp.net中的ajax回调模式(ICallbackEventHandler)
客户端回调本质上就是指通过前端的客户端脚本向服务器端传递相应的数据参数,服务器端再以接受到的参数进行查询和处理,最后将结果回传到客户端进行显示.asp.net 2.0提供了实现无刷新回调的接口ICal ...
- wav 转换到 flac
参考自:http://so.trust.blog.163.com/blog/static/17188620020127197618621/ wav 无损无压缩: flac无损压缩 将 wav 转换到 ...



