Struts2拦截器(Interceptor)

1.    理解拦截器

1.1.    什么是拦截器: 

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

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

谈到拦截器,还有一个词你们应该知道——拦截器链(Interceptor Chain,在Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按必定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其以前定义的顺序被调用。web

1.2.    拦截器的实现原理: 

大部分时候,拦截器方法都是经过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,而后串成一个列表(list),最后一个一个地调用列表中的拦截器。以下图:cookie

 

2.    拦截器的配置

Struts 2已经为您提供丰富多样的,功能齐全的拦截器实现。你们能够至struts2jar包内的struts-default.xml查看关于默认的拦截器与拦截器链的配置。session

Struts2XWork)提供的拦截器的功能说明:app

 

拦截器框架

名字jsp

说明spa

Alias Interceptordebug

alias

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

Chaining Interceptor

chain

让前一个Action的属性能够被后一个Action访问,如今和chain类型的result)结合使用。 

Checkbox Interceptor

checkbox

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

Cookies Interceptor

cookies

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

Conversion Error Interceptor

conversionError

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

Create Session Interceptor

createSession

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

Debugging Interceptor

debugging

提供不一样的调试用的页面来展示内部的数据情况。

Execute and Wait Interceptor

execAndWait

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

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

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

Model Driven Interceptor

model-driven

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

Scoped Model Driven

scoped-model-driven

若是一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用ActionsetModel方法将其放入Action内部。

Parameters Interceptor

params

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

Prepare Interceptor

prepare

若是Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

Action状态存入sessionapplication的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequestHttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

struts.xml文件中将中的 中的内容设置到对应的Action中。

Roles Interceptor

roles

肯定用户是否具备JAAS指定的Role,不然不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

经过Token来避免双击

Token Session Interceptor

tokenSession

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

Validation Interceptor

validation

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

Workflow Interceptor

workflow

调用Actionvalidate方法,一旦有错误返回,从新定位到INPUT画面

Parameter Filter Interceptor

N/A

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

Profiling Interceptor

profiling

经过参数激活profile

 

       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>

        ......

 

3.    使用拦截器

一旦定义了拦截器和拦截器栈后,就可使用这个拦截器或拦截器栈来拦截Action了。拦截器的拦截行为将会在Actionexceute方法执行以前被执行。

<action name="userOpt" class="org.qiujy.web.struts2.action.UserAction">

            <result name="success">/success.jspresult>

            <result name="error">/error.jspresult>

<interceptor-ref name="defaultStack"/>

            <interceptor-ref name="拦截器名或拦截器栈名"/>

        action>

       此处须要注意的是,若是为Action指定了一个拦截器,则系统默认的拦截器栈将会失去做用。为了继续使用默认拦截器,因此上面配置文件中手动引入了默认拦截器。

4.    自定义拦截器

做为“框架(framework)”,可扩展性是不可或缺的。虽然,Struts 2为咱们提供如此丰富的拦截器实现,可是这并不意味咱们失去建立自定义拦截器的能力,偏偏相反,在Struts 2自定义拦截器是至关容易的一件事。

4.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方法。

4.2.    使用自定义拦截器:

两个步骤:

l  经过元素来定义拦截器。

l  经过元素来使用拦截器。

5.    自定义拦截器示例

5.1.    问题描述:

使用自定义拦截器来完成用户权限的控制:当浏览者须要请求执行某个操做时,应用须要先检查浏览者是否登陆,以及是否有足够的权限来执行该操做。

5.2.    实现权限控制拦截器类:

AuthorizationInterceptor.java

package org.qiujy.common;

 

import java.util.Map;

 

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionInvocation;

import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

 

/**

 * 权限检查拦截器

 *

 * @author qiujy

 * @version 1.0

 */

public class AuthorizationInterceptor extends AbstractInterceptor {

 

    /*

     * 拦截Action处理的拦截方法

     *

     */

    public String intercept(ActionInvocation invocation) throws Exception {

       

        Map session = invocation.getInvocationContext().getSession();

        String userName = (String) session.get("userName");

       

        if (null != userName && userName.equals("test")) {

            System.out.println("拦截器:合法用户登陆---");

            return invocation.invoke();

        } else {

            System.out.println("拦截器:用户未登陆---");

            return Action.LOGIN;

        }

    }

}

 

5.3.    配置权限控制拦截器:

struts.xml

DOCTYPE struts PUBLIC

        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

     &n

相关文章
相关标签/搜索