解决方案

Struts2 拦截器

seo靠我 2023-09-23 22:16:32

Struts2拦截器

一、什么是拦截器?

1、拦截器,在AOP(Aspect-Oriented Programming<面向切面编程>)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操SEO靠我作。拦截是AOP的一种实现策略。

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

2、拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor StaSEO靠我ck)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

3、如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦SEO靠我截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):

<interceptor-SEO靠我ref name="checkbox">

  <param name="uncheckedValue">0</param>

</interceptor-ref>

<interceptor-ref name="dSEO靠我efaultStack"/>

 (必须加,否则出错)

4、也可以改为对全局Action设置自己需要的拦截器,如下:

在struts.xml里面定义全局的配置设置

<package name="struts-shSEO靠我op" extends="struts-default">

<interceptors>

      <interceptor-stack name="myStack">

<interceptor-ref name="SEO靠我checkbox">

          <param name="uncheckedValue">0</param>

       </interceptor-ref>

       <interceptor-ref name="defaultStacSEO靠我k"/>

      </interceptor-stack>

    </interceptors>

<default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦SEO靠我截器堆栈)

  </package>

struts-action.xml里面配置Action如下:

  <package name="LogonAdmin" extends="struts-shop">(这里扩展stSEO靠我ruts.xml里面定义的配置就可以了)

  <action name="logon" class="logonAction">

<result>/jsp/smeishop/admin/index.jsp</SEO靠我result>     <result name="error">/jsp/smeishop/admin/logon.jsp</result>

<result name="input">/jsp/smeSEO靠我ishop/admin/logon.jsp</result>

   </action>

   <action name="logout" class="logoutAction">

<result>/jsp/smeisSEO靠我hop/admin/logon.jsp</result>

   </action>

 </package>

二、Struts2自带的配置及其拦截器配置

1、Struts2 拦截器 [Interceptor]

拦截器的工SEO靠我作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action

执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,SEO靠我Action也可以直接退出操作返回客户既定的画面。

2、如何自定义一个拦截器?

自定义一个拦截器需要三步:

1)自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的SEO靠我类。

2)在strutx.xml中注册上一步中定义的拦截器。

3)在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这SEO靠我个拦截器拦截。

(1)、Interceptor接口声明了三个方法:

public interface Interceptor extends Serializable {

    void destroy();

voSEO靠我id init();

    String intercept(ActionInvocation invocation) throws Exception;

}

A、Init方法在拦截器类被创建之后,在对ActioSEO靠我n镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。

B、Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

CSEO靠我、Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后SEO靠我拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的SEO靠我实现,这个实现为:

public abstract class AbstractInterceptor implements Interceptor {

     public void init() {

    }

publSEO靠我ic void destroy() {

    }

    public abstract String intercept(ActionInvocation invocation) throws Exception;

}SEO靠我

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

例:

写一个Session过滤用的拦截器,该拦截器查看用户SessSEO靠我ion中是否存在特定的属性(LOGIN属性)

如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:

public class CheckLoginInterceptor extends ASEO靠我bstractInterceptor {

    public static final String LOGIN_KEY = "LOGIN";

public static final String LOGIN_SEO靠我PAGE = "global.login";

public String intercept(ActionInvocation actionInvocation)

 throws Exception {

SySEO靠我stem.out.println("begin check login interceptor!");

        // 对LoginAction不做该项拦截

Object action = actionInvocaSEO靠我tion.getAction();

        if (action instanceof LoginAction) {

System.out.println("exit check login, because tSEO靠我his is login action.");

            return actionInvocation.invoke();

        }

        // 确认Session中是否存在LOGIN

Map    session = actiSEO靠我onInvocation.getInvocationContext()

.getSession();

        String login = (String) session.get(LOGIN_KEY);

if (SEO靠我login != null && login.length() > 0) {

            // 存在的情况下进行后续操作。

            System.out.println("already login!");

return acSEO靠我tionInvocation.invoke();

        } else {

            // 否则终止后续操作,返回LOGIN

System.out.println("no login, forward login page!SEO靠我");

            return LOGIN_PAGE;

        }

    }

}

// 注册拦截器

<interceptors>

            <interceptor

name="login" 

class="com.jpleasure.teamware.SEO靠我util.CheckLoginInterceptor"/>

            <interceptor-stack name="teamwareStack">

<interceptor-ref name="login"/>SEO靠我

                <interceptor-ref name="defaultStack"/>

            </interceptor-stack>

</interceptors>

将上述拦截器设定为默认拦截器:

<default-intSEO靠我erceptor-ref name="teamwareStack"/>

这样在后续同一个package内部的所有Action执行之前都会被login拦截。

三、Struts2(XWork)提供的拦截器的功SEO靠我能说明:

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以SEO靠我被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处SEO靠我理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value来是SEO靠我指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session SEO靠我Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不SEO靠我同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception IntSEO靠我erceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的localSEO靠我e

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出SEO靠我现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

SSEO靠我coped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用ActionSEO靠我的setModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果ASEO靠我cton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

将Action状态存入session和application的简单方法SEO靠我

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

StatSEO靠我ic Parameters Interceptor

staticParams

从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。

Roles InterceSEO靠我ptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过TokenSEO靠我来避免双击

Token Session Interceptor

tokenSession

和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

Validation InSEO靠我terceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用Action的validSEO靠我ate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profilinSEO靠我g

通过参数激活profile

注册并引用Interceptor

<package name="default" extends="struts-default">

   <interceptors>

<intercSEO靠我eptor name="timer" class=".."/>

       <interceptor name="logger" class=".."/>

   </interceptors>

<action name="lSEO靠我ogin" class="tutorial.Login">

        <interceptor-ref name="timer"/>

        <interceptor-ref name="logger"/>

<result SEO靠我name="input">login.jsp</result>

        <result name="success"

            type="redirect-action">/secure/home</result>

</aSEO靠我ction>

</package>

四、可以将多个拦截器合并在一起作为一个堆栈调用

当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。

<packageSEO靠我 name="default" extends="struts-default">

   <interceptors>

        <interceptor name="timer" class=".."/>

<intercSEO靠我eptor name="logger" class=".."/>

        <interceptor-stack name="myStack">

           <interceptor-ref name="timer"/>

<inSEO靠我terceptor-ref name="logger"/>

        </interceptor-stack>

    </interceptors>

<action name="login" class="tutuoriaSEO靠我l.Login">

         <interceptor-ref name="myStack"/>

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

<result name="succeSEO靠我ss"

             type="redirect-action">/secure/home</result>

    </action>

</package>

上述说明的拦截器在默认的Struts2应用中,根据惯例配置了若干个拦SEO靠我截器堆栈,详情参看struts-default.xml

其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action上。

<interceptor-stack name="defaultStack">SEO靠我

    <interceptor-ref name="exception"/>

    <interceptor-ref name="alias"/>

<interceptor-ref name="servletConfSEO靠我ig"/>

    <interceptor-ref name="prepare"/>

    <interceptor-ref name="i18n"/>

    <interceptor-ref name="chain"/>

<SEO靠我interceptor-ref name="debugging"/>

    <interceptor-ref name="profiling"/>

<interceptor-ref name="scopedMoSEO靠我delDriven"/>

    <interceptor-ref name="modelDriven"/>

    <interceptor-ref name="fileUpload"/>

<interceptor-reSEO靠我f name="checkbox"/>

    <interceptor-ref name="staticParams"/>

    <interceptor-ref name="params">

<param name=SEO靠我"excludeParams">dojo/..*</param>

    </interceptor-ref>

    <interceptor-ref name="conversionError"/>

<intercepSEO靠我tor-ref name="validation">

        <param name="excludeMethods">input,back,cancel,browse</param>

</interceptorSEO靠我-ref>

    <interceptor-ref name="workflow">

        <param name="excludeMethods">input,back,cancel,browse</param>

<SEO靠我/interceptor-ref>

</interceptor-stack>

四、每一个拦截器都可以配置参数

有两种方式配置参数,一是针对每一个拦截器定义参数,二是针对一个拦截器堆栈

统一定义所有的参数,例如SEO靠我

<interceptor-ref name="validation">

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

</iSEO靠我nterceptor-ref>

<interceptor-ref name="workflow">

<param name="excludeMethods">myWorkflowExcludeMethodSEO靠我</param>

</interceptor-ref>

或者

<interceptor-ref name="defaultStack">

<param name="validation.excludeMethSEO靠我ods">myValidationExcludeMethod</param>

<param name="workflow.excludeMethods">myWorkflowExcludeMethod<SEO靠我/param>

</interceptor-ref>

每一个拦截器都有两个默认的参数:

excludeMethods - 过滤掉不使用拦截器的方法和

includeMethods - 使用拦截器的方法。

需要说SEO靠我明的几点:

1 拦截器执行的顺序按照定义的顺序执行,例如:

<interceptor-stack name="xaStack">

<interceptor-ref name="thisWillRunFirsSEO靠我tInterceptor"/>

  <interceptor-ref name="thisWillRunNextInterceptor"/>

<interceptor-ref name="followedBySEO靠我ThisInterceptor"/>

  <interceptor-ref name="thisWillRunLastInterceptor"/>

</interceptor-stack>

的执行顺序为:

thiSEO靠我sWillRunFirstInterceptor

  thisWillRunNextInterceptor

    followedByThisInterceptor

thisWillRunLastInterceptoSEO靠我r

        MyAction1

        MyAction2 (chain)

        MyPreResultListener

        MyResult (result)

      thisWillRunLastInterceptor

followedByTSEO靠我hisInterceptor

  thisWillRunNextInterceptor

thisWillRunFirstInterceptor

2 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:

<SEO靠我action name="login"  class="tutorial.Login">

     <interceptor-ref name="timer"/>

<interceptor-ref name="loSEO靠我gger"/>

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

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

<result type="rSEO靠我edirect-action">/secure/home</result>

</action>

可以按照如下的方式定义:

<interceptors>

<interceptor-stack name="mySSEO靠我tack">

        <interceptor-ref name="timer"/>

        <interceptor-ref name="logger"/>

<interceptor-ref name="default-SEO靠我stack"/>

     </interceptor-stack>

</interceptors>

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

<action name="loSEO靠我gin"  class="tutorial.Login">

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

<result type="redirect-action">/SEO靠我secure/home</result>

</action>

3 如何访问HttpServletRequest,HttpServletResponse或者HttpSession

有两种方法可以达到效果,使用SEO靠我ActionContext:

Map attibutes = ActionContext.getContext().getSession();

或者实现相应的接口:

HttpSession         SEO靠我   SessionAware

HttpServletRequest     ServletRequestAware

HttpServletResponse    ServletResponseAwareSEO靠我

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2