struts2struts2的默认拦截器器多少个

您现在的位置:&&>>&&>>&&>>&&>>&正文
struts2 18拦截器详解:(准备知识)
&&& 准备知识&&& struts2作为一优秀的Web层框架,其拦截器机制更是让其如虎添翼,下面将详细介绍struts2内置的defaultStack中的18拦截工作原理其及功能。但讲解之前必须先了解struts2中拦截器的执行流程,以更好地理解各个拦截器的执行与功能。&&& struts2中拦截器与Action的执行调度即执行流程或者说执行顺序是由ActionInvocation来完成的(如果此处不怎么了解可以参看struts2处理请求流程详解),ActionInvocation是一接口,struts2其默认实现类是DefaultActionInvocation,拦截器与Action的执行调度就是由该完成,调度逻辑就在该类的invoke方法中,下面是invoke方法核心源码:&&& //上面省略很多代码…&&& //判断是否有下一个拦截器&&& if (interceptors.hasNext()) {&&& final InterceptorMapping interceptor = (InterceptorMapping) interceptors.next();//获取拦截器配置&&& String interceptorMsg = "interceptor: " + interceptor.getName();&&& UtilTimerStack.push(interceptorMsg);&&& try {&&& //执行拦截器的intercept方法&&& resultCode = interceptor.getInterceptor()。intercept(DefaultActionInvocation.this);&&& }&&& finally {&&& UtilTimerStack.pop(interceptorMsg);&&& }&&& } else {&&& //执行Action&&& resultCode = invokeActionOnly();&&& }&&& //下面省略很多代码&&& return resultC&&& }&&& finally {&&& UtilTimerStack.pop(profileKey);&&& }&&& }&&& 在DefaultActionInvocation的init方法中完成了对当前正在执行的Action所应用上的拦截器的配置信息,放置在一个名为interceptors的List当中,通过配置信息就能获取相应的拦截器实例并执行其intercept方法,并且把ActionInvocation自已作为输入参数传递进了拦截器的intercept方法,如果在拦截器的intercept方法中又调用了ActionInvocation的invoke方法则又会再次进入invoke方法,只不过这次执行的拦截器是下一个拦截器,依此类推,假设所有拦截器都调用了ActionInvocation的invoke方法,则会把Action所应用上的所有拦截器执行一遍,如果所有拦截器都已执行完成即没有下一个拦截器了,则 if (interceptors.hasNext()) 该if条件不成立就会执行invokeActionOnly()方法,执行完Action各个拦截器依次返回,需要注意的是返回的顺序与执行的顺序刚好相反,后执行的拦截器先执行完成返回,这一点非常重要,这与Filter的执行机制是很类似的。所有拦截执行返回后得到一个resultCode去寻找相应的Result进行执行,生成页面。&&& struts2中所有的拦截器都要实现Interceptor接口,下面看一个其接口声明:&&& public interface Interceptor extends Serializable {&&& void destroy();&&& void init();&&& String intercept(ActionInvocation invocation) throws E&&& }&&& 其中就三个方法,destroy在拦截器销毁的时候会执行,init方法会在拦截器实例化完成后立即执行,最重要的是intercept方法,该方法中执行的逻辑直接影响到整个拦截器的执行流程,如果intercept方法中调用了invocation.invoke()方法则会执行下一个拦截器,如果没有调用而直接返回一个字符串则后面的所有拦截器都不会执行,更不会执行Action,然后该拦截器与前面的拦截器执行返回。&&& 拦截器与Action的执行调度是非常重要的,只有理解了这一点才能更好的理解拦截器的工作原理。
【责编:peter】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航个人总结的java超详细的Struts2拦截器使用和拦截栈的配置 - 大鹏gg - 推酷
个人总结的java超详细的Struts2拦截器使用和拦截栈的配置 - 大鹏gg
Struts2的拦截器是个好利器!尤其是自定义拦截器,以下是我个人整理的很详细的整个流程,希望给大家带来帮助,有更好见解的希望可以提出宝贵的意见。
a)&&&&&&&& Web浏览器发送请求
b)&&&&&&&& 首先通过一组Struts2默认的拦截栈 dispatcher (或者 ServletFilter)
c)&&&&&&&& 自定义interceptor(拦截器)
d)&&&&&&&& Action
e)&&&&&&&& Result
struts.xml配置如下:
1 &package name=”default” namespace=”/” extends=”struts-default”&
&--所有的配置都应放在package中--&
&interceptors&
&-- 所有的拦截器自定义的配置和引用、已经拦截栈的定义都应放在interceptors中--&
&-- 自定义拦截器 name指定自定义拦截器的引用名称
class 指定该拦截器的实现类(完整路径) --&
&interceptor name=&sessionCheck& class=&com.cqrcb.perinvite.interceptor.AuthorityInterceptor& /&
&-- 自定义拦截栈 name 指定自定义拦截栈的引用名称 --&
&interceptor-stack name=&sessionCheckStack&&
&-- name为所要引用的拦截器的引用名称 刚才定义了一个name为 sessionCheck的拦截器,则引用就为 sessionCheck--&
&-- 每一个自定义的拦截栈都应该必须配上defaultStack拦截栈,该拦截栈是Struts2默认的拦截栈,里面封装了一组拦截器--&
12 &interceptor-ref name=&defaultStack& /&
&interceptor-ref name=&sessionCheck& /&
&/interceptor-stack&
&/interceptors&
配置全局默认的Action -- &
&default-action-ref name=&IndexAction& /&
& -- 配置全局默认的result-- &
&global-results&
&-- 配置token的invalid.token的返回视图,即当页面重复提交,页面将自动转到/error.jsp页面并提示 -- &
&result name=&invalid.token&&/error.jsp&/result&
&result name=&error&&/error.jsp&/result&
&-- 配置name为backhome的resule,重定向为IndexAction-- &
&result name=&backhome&
type=&redirectAction&&IndexAction&/result&
&-- 配置name为testChain的resule, 转发跳转到testAction -- &
&result name=&testChain&
type=&chain &&testAction&/result&
&/global-results&
& --使用拦截器有两种方式,annoction(注解)和xml配置,以下是XML配置--&
&action name=&testAction& class=&com.cqrcb.perinvite.resume.action.testAction&&
&-- 在此Action访问之前引入sessionCheckStack拦截栈 name为拦截栈定义的引用名称-- &
&-- 此sessionCheckStack已经包含了自定义拦截器和Struts2的默认拦截栈,所以直接引用sessioncheckstack即可-- &
&interceptor-ref name=& sessionCheckStack &/&
&-- 如果直接引用自定义的拦截器,即没有包含默认的拦截栈,则需要引用Struts2的默认拦截栈,以下-- &
&interceptor-ref name=”testInter”/&
&interceptor-ref name=”defaultStack”/&
&-- 一个Action中只要有一个defaultStack即可,如果引用的拦截栈有了defaultStack,则就不必再引用defaultStack,否则,引之-- &
42 &result name=&success&&
Success.jsp
&result name=&input&&
49 &/package&
annoction注解中使用拦截器和拦截栈
1 //直接在类名称的上端写入即可,value中指定要引入的拦截器的名称即可
@InterceptorRef(value=&token&)
//拦截栈的引用,蓝色字体即拦截栈的引用名称
4 @InterceptorRefs(@InterceptorRef(&sessionCheckStack&))
自定义拦截器的javabean
package com.cqrcb.perinvite.
import com.cqrcb.perinvite.logon.action.IndexA
import com.netbank.pub.vo.core.PbClientInfoVO;
import com.opensymphony.xwork2.ActionC
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
* 权限拦截Action
* @author wangyupeng
//继承 AbstractInterceptor 类
public class AuthorityInterceptor extends AbstractInterceptor{
private static final long serialVersionUID = 6035745L;
//重写intercept方法
public String intercept(ActionInvocation invocation) throws Exception {
//获取Action的拦截路径
ActionContext ax = invocation.getInvocationContext();
//获取Action对象
Object action = invocation.getAction();
// 对IndexAction不做该项拦截
action instanceof IndexAction 解释为如果Action的实例为IndexAction
if (action instanceof IndexAction) {
//如果是IndexAction,则进行执行,即不做拦截
return invocation.invoke();
//获取session中key为pinfo的对象
PbClientInfoVO pinfo =(PbClientInfoVO) ax.getSession().get(&pinfo&);
if(pinfo==null){
//如果pinfo为null,则返回全局result为backhone的视图
return &backhome&;
//如果都不为false,则不做拦截
return invocation.invoke();
struts2的自定义拦截器有很多方式,本文的内容是前置拦截,即获取到action的请求所做的拦截。struts2还有后置拦截和中间拦截,这两种也是很常用的,有时间整理完之后我会发到博客,大家一起探讨。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致本帖子已过去太久远了,不再提供回复功能。Struts2拦截器 实现未登录拦截和权限控制 -
- ITeye技术网站
博客分类:
最近在研究struts,把以前做项目时候用拦截器实现的一些功能回想起来跟大家分享一下:
先创建一个拦截器,实现MethodFilterInterceptor这个抽象类,可以进行方法的限制和包含过滤。
该拦截器实现未登录不能进行访问的功能,可以扩展成对权限进行控制。
import java.util.M
import com.opensymphony.xwork2.A
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
public class LogonInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation arg0) throws Exception {
Map session = arg0.getInvocationContext().getSession();
user =session.get("user");
if (存在该用户) {
return arg0.invoke();
return Action.LOGIN;
然后将这个拦截器配置的struts.xml里面:
&!-- 配置拦截器 --&
&package name="my-default" extends="struts-default"&
&&&& &interceptors&
&&&&&&&& &!-- 配置未登录进行操作的拦截器 --&
&&&&&&&& &interceptor name="loginInterceptor" class="com.struts2.interceptor.LogonInterceptor"&
&&&&&&&&&&&& &param name="param"&测试参数&/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="login" class="LoginAction" method="load"&
&interceptor-ref name="paramsPrepareParamsStack" /&
&!--result元素设置页面跳转值,其中name值为目标页面的字符串标识,如下,登录失败时回到login.jsp页面,成功时,转向success.jsp页面 --&
&result name="error"&/error.jsp&/result&
&result name="success"&/main.jsp&/result&
&result name="input"&/login.jsp&/result&
&/package&
浏览: 112435 次
来自: 苏州
除了火狐正常外,ie和谷歌下载的文件名称都没有后缀,如何解决
springmvc提供的excel导出还是挺方便的.
不错,很详细
我用的是spring3.0.5也出现这个问题,到底是少了那个j ...
在吗?能帮忙解决一下问题吗?}

我要回帖

更多关于 struts2拦截器的作用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信