`

7.struts2核心---拦截器(interceptor)

阅读更多
interceptor(拦截器)作为struts2的核心内容,struts2的大部分功能都是靠拦截器来实现的,如:校验,国际化,类型转换。。。

1.拦截器的概念

拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。

在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。

说到拦截器,不得不提下过滤器,其两者原理非常相似,在过滤器里面有过滤器链这个说法,而在Struts 2中称为拦截器栈Interceptor Stack。拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

2.拦截器的实现原理

当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器,这个和过滤器原理相似,从下面的图中可以很容易理解其工作方式。



3.struts2自带的拦截器

struts2默认提供了十分丰富的拦截器,大家可以在struts2-core-2.3.1.2.jar包中的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

//截取的部分默认拦截器
<interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
            <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
            <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
            <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
            <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
            <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
            <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
            <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
            <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
            <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
            <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
            <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
            <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
            <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
            <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
            <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
            <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
            <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
            <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
            <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
            <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
            <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
            <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
            <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
            <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
</interceptors>


4.拦截器的配置

既然struts2自带了这么多拦截器,那么我们该怎么使用呢?下面我将给大家介绍自带拦截器的使用。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >

<struts>
	<package name="myStruts2" extends="struts-default">
		<action name="login" class="com.hx.struts2.LoginAction">
		    <result name="success">suc.jsp</result>
                    //使用自带的timer拦截器
                    <interceptor-ref name="timer"></interceptor-ref>
		</action>
	</package>
</struts>
/*
注:package 的name属性可以随便取,extends属性值必须是struts-default,如果想让某个Action使用某个拦截器只需在此Action里面加上如上配置即可,<interceptor-ref name="xxx"></interceptor-ref>,这个name属性值和你想要用的自带拦截器name属性值对应即可,要特别注意的是,每个action都有默认的拦截器,你如果加上“<interceptor-ref name="xxx" />”就会覆盖默认的defaultStack。如果你既想使用默认defaultStack,又想使用你想用的如上的<interceptor-ref name="timer"></interceptor-ref>拦截器,该怎么办呢?其实很简单,你只需在action的上面自己建一个拦截器栈即可。方法如下。
*/
<interceptors>
	<interceptor-stack name="myStack">
		<interceptor-ref name="defaultStack"></interceptor-ref>
		<interceptor-ref name="timer"></interceptor-ref>
	</interceptor-stack>
</interceptors>
//现在只需引入<interceptor-ref name="myStack"></interceptor-ref>即可满足你的需求,
//myStack里面可以任意添加自己想要实现的拦截器。


5.自定义拦截器的实现

大家用着用着可能发现使用自带的太局限了,struts2当然也早就考虑到这个问题,所以人家就利用那句话---“约定大于配置”,给你一个约定,你可以按照约定自己编写自己想要的拦截器,下面就给大家介绍该如何编写一个自己的拦截器。

//拦截器分为两种:1>.普通拦截器 2>方法拦截器

//大家在创建拦截器的时候一定要注意:拦截器必须是无状态的,否则可能引起线程同步 !

//1>.普通拦截器
public class MyInterceptor implements Interceptor { 
 
@Override 
public void destroy() { 
  System.out.println("interceptor销毁"); 
} 
 
@Override 
public void init() { 
  System.out.println("interceptor初始化"); 
} 
 
@Override 
public String intercept(ActionInvocation invocation)  
  throws Exception { 
  //验证代码...
  return xxx; 
} 
//如果你不需要init和destroy方法,你可以直接继承AbstractInterceptor

//在action里面配置自定义的拦截器
<interceptors> 
  <interceptor name="myTimer" class="com.kaishengit.interceptor.MyInterceptor">  </interceptor> 
  <interceptor-stack name="myInterceptor"> 
    <interceptor-ref name="myTimer"></interceptor-ref> 
    <interceptor-ref name="defaultStack"></interceptor-ref> 
  </interceptor-stack> 
</interceptors> 


//2>方法拦截器
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyMethodInterceptor extends MethodFilterInterceptor {

  private static final long serialVersionUID = 1L;

  @Override
  protected String doIntercept(ActionInvocation invocation) throws Exception   {
	
    System.out.println(invocation.getProxy().getMethod() + "interceptor...");
    return invocation.invoke();	

  }

}
//方法拦截器的配置和普通拦截器的一样,方法拦截器还可以自定义拦截哪些方法
<interceptor-ref name="myMethodInterceptor">
    //会拦截的方法
    <param name="includeMethods">login,edit,saveEdit</param>
    //放行的方法
    <param name="excludeMethods">execute,edit</param>
</interceptor-ref>

/*
最后还想给大家说一点技巧,如果你想让每个action都应用某个拦截器或者拦截器栈,为每个action都配置此个拦截器肯定不合理,这时候你可以自定义一个默认的拦截器。注意:默认拦截器一定要放到定义的拦截器的下面,这个struts2的约定!
*/
<default-interceptor-ref name="myStack"></default-interceptor-ref>
/*
另外还有你对用户是否登录的验证时候,没登录的必须让其返回到登录页进行登录,这时你可以配置一个全局的result。
*/
<global-results>
	<result name="error" type="redirectAction">index</result>
</global-results>


好了,对于struts2的拦截器就说到这里,下一篇将给大家说一下struts2的文件上传。
  • 大小: 42.2 KB
分享到:
评论

相关推荐

    struts-2.5.22-all.zip

    Struts2框架的优势在于其强大的拦截器(Interceptor)机制,允许开发者定义自定义的行为,如日志记录、权限检查等,可以在请求处理流程中的不同阶段插入。此外,它还支持多种结果类型,如Redirect、Stream等,方便...

    struts-2.5.26-min-lib.zip

    同时,了解Struts 2的配置文件(如struts.xml)和MVC模式是至关重要的,它们定义了Action的映射、结果类型、拦截器栈等关键配置。 总之,Struts 2.5.26-min-lib.zip是构建基于Struts 2的应用程序的基础,包含了一...

    struts2版本 2.1.6 必须的jar包 和 web.xml 文件的修改

    首先,Struts2的核心jar包是框架运行的基础,它们提供了Action映射、拦截器、结果类型和其他关键功能。对于Struts2 v2.1.6,以下是一些必要的jar文件: 1. **struts2-core.jar** - 包含Struts2框架的核心组件,如...

    Struts2 拦截器 Interceptor

    2. **拦截器栈**:多个拦截器的集合称为拦截器栈,Struts2默认提供了几个内置的拦截器栈,如`defaultStack`、`jsonStack`等,也可以自定义拦截器栈。 3. **拦截器配置**:拦截器可以通过Struts2的配置文件`struts....

    在struts1中使用拦截器——saif-0.1.jar

    在Struts1中,拦截器是框架的核心组件之一,它们提供了扩展功能和处理请求的能力,而无需修改Action类本身。本文将深入探讨在Struts1中如何使用拦截器,并以saif-0.1.jar为例,解释其在实际项目中的应用。 首先,...

    struts2所必需的5个包

    Action是业务逻辑的载体,Result定义了动作执行后的结果导向,Interceptor是Struts2的拦截器机制,用于在Action执行前后进行额外的操作,如日志记录、权限检查等。此外,核心库还包含了配置管理、插件支持、类型转换...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    struts-2.3.16-all

    Interceptor(拦截器)是Struts 2中的一个重要特性,它们按照预定义的顺序在Action执行前后进行干预,实现了如日志记录、权限验证等功能。ValueStack则是存储Action属性和OGNL表达式之间交互的对象容器。 Struts 2...

    struts2 相关jar包 包含json-lib-2.1.jar+struts2-json-plugin-2.1.8.1.jar

    - **Interceptor(拦截器)**:这些是Struts2中的重要组件,它们在Action调用前后执行,提供了事务控制、日志记录、权限验证等功能。 - **配置文件**:通常有struts.xml或类似的配置文件,用于定义Action、结果...

    xwork-2.1.5-all.rar_xwork_xwork-2.1.5_xwork-2.1.5.jar_xwork-core

    3. **Interceptor(拦截器)**: XWork的拦截器机制是其一大亮点,它允许在Action执行前后插入自定义的处理逻辑,如日志记录、事务管理、权限控制等。通过组合不同的拦截器,可以构建出灵活的业务流程。 4. **配置...

    struts2-core-2.1.8.1 xwork-core-2.1.6源码

    2. **拦截器(Interceptors)**:Struts2的拦截器是其强大的特性之一,允许开发者在Action执行前后添加自定义逻辑。这些拦截器可以实现登录验证、日志记录、性能监控等多种功能。在源码中,你可以看到`...

    struts2 Interceptor详解

    总之,Struts2拦截器是框架的核心组件之一,它极大地增强了系统的可维护性和可扩展性。开发者应当充分利用拦截器来实现业务逻辑的解耦,提高代码的复用性和灵活性。通过深入学习和实践,我们可以熟练掌握这一强大...

    struts-2.3.4笔记

    通过 `&lt;interceptor&gt;` 和 `&lt;interceptor-stack&gt;` 标签可以在配置文件中定义和组织拦截器。 3. **值栈(Value Stack)**:值栈是 Struts 2 提供的一种数据管理机制,它将 Action 对象、ActionForm 对象和其他模型...

    Struts2.1.8最基础包完整包.zip

    拦截器(Interceptor)可以插入到Action调用的流程中,实现如日志记录、权限验证等通用功能。视图通常使用Freemarker模板,通过OGNL表达式获取并显示模型数据。 总的来说,Struts2.1.8基础包提供了构建Web应用的...

    struts2.3.32修补S2-045漏洞所有核心jar包及依赖的jar(含core包)

    `struts2-core-2.3.32.jar`是Struts2的核心库,包含了许多关键组件,如Action类、Interceptor拦截器、Result结果类型等。它负责处理HTTP请求,解析请求参数,执行业务逻辑,并将结果返回给用户。在这个版本中,针对...

    struts-2.0.1-all.zip

    1. `struts-2.0.1/struts2-core.jar`:这是Struts 2的核心库,包含Action、Result、Interceptor等核心组件。 2. `struts-2.0.1/ognl.jar`:OGNL(Object-Graph Navigation Language)是Struts 2中用于表达式语言,...

    Struts.2权威指南--基于WebWork核心的MVC开发.0004.pdf

    - Struts 2框架继承了Struts 1的优点,并对其进行了改进,支持更灵活的配置方式和更强大的拦截器机制。 #### 2. **MVC设计模式** - MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序分为三个核心...

    struts2入门实例2 经典入门必备

    1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用struts标签的登陆页面 ...2.Struts2_03_TypeConverter ... 拦截器 17.Struts2_09up&down 上传和下载

    struts2入门实例1

    struts2 最新的入门实例 我自己总结的 呵呵,欢迎提出宝贵的意见 1.Struts2_01_login 对应登录。。 ... login_struts2.jsp-------------------------------采用... 拦截器 17.Struts2_09up&down 上传和下载

Global site tag (gtag.js) - Google Analytics