1. 什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
谈到拦截器,还有一个词大家应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
2.拦截器实现原理
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(list),最后一个一个地调用列表中的拦截器。
3.拦截器的配置
Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。可以到struts2的struts2-core-2.1.8.jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置,如下:
- <interceptor-stack name="defaultStack">
-
<interceptor-ref name="exception"/>
-
<interceptor-ref name="alias"/>
-
<interceptor-ref name="servletConfig"/>
-
<interceptor-ref name="i18n"/>
-
<interceptor-ref name="prepare"/>
-
<interceptor-ref name="chain"/>
-
<interceptor-ref name="debugging"/>
-
<interceptor-ref name="scopedModelDriven"/>
-
<interceptor-ref name="modelDriven"/>
-
<interceptor-ref name="fileUpload"/>
-
<interceptor-ref name="checkbox"/>
-
<interceptor-ref name="multiselect"/>
-
<interceptor-ref name="staticParams"/>
-
<interceptor-ref name="actionMappingParams"/>
-
<interceptor-ref name="params">
-
<param name="excludeParams">dojo\..*,^struts\..*</param>
-
</interceptor-ref>
-
<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-stack>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<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-stack>
在struts.xml文件中定义拦截器,拦截器栈:
- <package name="my" extends="struts-default" namespace="/manage">
-
-
<interceptors>
-
-
-
-
<interceptor name="拦截器名" class="拦截器实现类"/>
-
-
-
-
<interceptor-stack name="拦截器栈名">
-
-
<interceptor-ref name="拦截器一"/>
-
-
<interceptor-ref name="拦截器二"/>
-
-
</interceptor-stack>
-
-
</interceptors>
-
- ......
-
-
</package>
<package name="my" extends="struts-default" namespace="/manage">
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="拦截器名" class="拦截器实现类"/>
<!-- 定义拦截器栈 -->
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器一"/>
<interceptor-ref name="拦截器二"/>
</interceptor-stack>
</interceptors>
......
</package>
4.使用拦截器
一旦定义了拦截器和拦截器栈后,就可以使用这个拦截器或拦截器栈来拦截Action了。拦截器的拦截行为将会在Action的exceute方法执行之前被执行。
- <action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">
-
-
<result name="success">/success.jsp</result>
-
<result name="error">/error.jsp</result>
-
-
-
<interceptor-ref name="defaultStack"/>
-
<interceptor-ref name="拦截器名或拦截器栈名"/>
-
-
</action>
<action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
<!-- 使用拦截器,一般配置在result之后, -->
<!-- 引用系统默认的拦截器 -->
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="拦截器名或拦截器栈名"/>
</action>
此处需要注意的是,如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,所以上面配置文件中手动引入了默认拦截器。
5.自定义拦截器
5.2.使用自定义拦截器
两个步骤:
l 通过<interceptor …>元素来定义拦截器。
l 通过<interceptor-ref …>元素来使用拦截器。
作为“框架(framework)”,可扩展性是不可或缺的。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。
5.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方法。
分享到:
相关推荐
拦截器是Struts2框架中的核心组件之一,它在MVC(Model-View-Controller)架构中扮演着重要角色,实现了灵活的业务逻辑处理和请求流程控制。本文将深入探讨Struts2拦截器的工作原理及其应用。 首先,我们要理解什么...
以下是对Struts2拦截器原理与实现的详细解析: 1. **拦截器的概念** Struts2拦截器是一种AOP(面向切面编程)的实现,它可以在不修改Action代码的情况下,通过定义拦截器并在配置文件中设置拦截器链,来动态地添加...
在这个“Struts2拦截器实现权限控制demo”中,我们将深入探讨如何利用拦截器来实现细粒度的用户权限管理。 首先,我们需要了解Struts2中的拦截器工作原理。拦截器是基于Java的动态代理模式实现的,它们按照配置的...
在文章"Struts2拦截器原理分析实例"中,作者通过一个具体的应用场景,展示了如何配置和使用拦截器来实现特定的功能,比如日志记录或权限验证。通过阅读这篇博客,我们可以更直观地理解拦截器的工作方式和价值。 ...
这篇博客文章“struts2拦截器实现权限控制”深入探讨了如何利用Struts2的拦截机制来执行用户访问权限的验证。 在Struts2中,拦截器是基于AOP(面向切面编程)的概念设计的,它们在Action调用前后执行,可以添加额外...
在实际项目中,我们通常会结合Spring Security等安全框架,通过拦截器实现更复杂的权限控制。 总结,Struts2拦截器是其核心机制之一,它允许开发者以模块化的方式添加额外的功能,提高代码的可复用性和可维护性。...
首先,我们需要了解Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)思想实现的,它通过在Action调用前后插入额外的操作,形成一个拦截链。当一个请求到来时,Struts2会按照配置的顺序依次执行这些拦截器...
Struts2 拦截器是基于Java的Servlet Filter设计模式的一种实现,它提供了一种在Action执行前后插入额外逻辑的方式。...通过合理的拦截器配置和自定义拦截器实现,可以构建出高效且易于维护的企业级Web应用。
拦截器在Struts2中扮演着至关重要的角色,它们是AOP(面向切面编程)的一个实现,用于在Action执行前后插入额外的功能。下面将详细探讨Struts2拦截器及其工作原理。 ### 一、Struts2 拦截器概念 1. **拦截器是什么...
这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...
拦截器名" class="拦截器实现类"/> ``` 如果需要向拦截器传递参数,可以使用`<param>`标签: ```xml 拦截器名" class="拦截器实现类"> 参数名">参数值 ``` #### 七、结论 通过对Struts2拦截器的深入分析,我们...
通过这两个实例,你将更深入地理解Struts2拦截器的工作原理和配置方式,以及它们如何在实际项目中发挥作用。记得在实践中多尝试,理解拦截器如何与其他Struts2组件协作,以提升你的Web应用开发技能。
下面我们将深入探讨Struts2拦截器的实现原理。 首先,让我们理解一下拦截器的基本概念。拦截器是基于Java的动态代理机制实现的,它可以看作是一个过滤器,它在Action调用前后执行一些额外的任务,如日志记录、权限...
在Struts2中,拦截器的工作原理如下: 1. 用户发起HTTP请求,请求到达Struts2的Front Controller(DispatcherServlet)。 2. DispatcherServlet会根据配置找到对应的Action(动作)类。 3. 在调用Action之前,...
首先,我们需要理解Struts2拦截器的工作原理。拦截器是基于Java的动态代理机制实现的,它们在Action调用之前和之后执行,形成一个拦截器链。开发者可以通过配置struts.xml或struts.properties文件来定义拦截器链和其...
这个"struts2拦截器应用小例子"可能包含了一个简单的拦截器实现,展示了如何在实际项目中集成和使用。通过这个例子,你可以学习到如何创建、注册拦截器,以及如何在Struts2框架中构建拦截器栈,从而更灵活地管理应用...
#### 二、Struts2拦截器的工作原理 拦截器的工作原理是基于责任链模式。当用户发起一个请求时,这个请求会经过一系列拦截器的处理,这些拦截器构成了一个责任链。每个拦截器都有机会处理请求或继续传递请求到下一个...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...
在实际开发中,我们可以通过扩展Struts2的拦截器实现自定义功能。例如,你可以创建一个新的拦截器来实现登录检查、权限控制或性能监控,然后将其添加到拦截器栈中。通过理解和研究Struts2的拦截器源码,我们可以更好...