当前位置:首页 > 开发 > 开源软件 > 正文

【Struts2 四】Struts2拦截器

发表于: 2014-08-28   作者:bit1129   来源:转载   浏览:
摘要: Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后某些逻辑处理,拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上。   Struts2中自定义拦截器的步骤是:

Struts2框架是基于拦截器实现的,可以对某个Action进行拦截,然后某些逻辑处理,拦截器相当于AOP里面的环绕通知,即在Action方法的执行之前和之后根据需要添加相应的逻辑。事实上,即使struts.xml没有任何关于拦截器的配置,Struts2也会为我们添加一组默认的拦截器,最常见的是,请求参数自动绑定到Action对应的字段上。

 

Struts2中自定义拦截器的步骤是:

1.定义拦截器类

2.为Action配置自定义的拦截器类

 

 

以定义一个检查是否有请求HelloWorldAction的权限为例

 

 定义拦截器类

 

package com.tom.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import org.apache.struts2.ServletActionContext;

//继承AbstractInterceptor
public class PermissionCheckInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
 
       //取permit请求参数,true表示有权限,其它表示没有权限
        String value = ((String[])invocation.getInvocationContext().getParameters().get("permit"))[0];

        Boolean permit = Boolean.valueOf(value);
        if (Boolean.TRUE.equals(permit)) {
            return invocation.invoke(); //调用Action的方法,并返回那个方法对应的结果视图
        }
        //在checkResult视图上显示message信息
        ServletActionContext.getRequest().setAttribute("message", "Permission denies");
        return "checkResult"; //结果转到checkResult对应的视图
    }

}

 

 

定义HelloWorldAction

 

 

package com.tom.actions;

public class HelloWorldAction {
    private String permit; //页面上输出permit的值
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String execute() {
        this.message = "Permission OK, the permit  value is: " + permit;
        return "checkResult";
    }

    public String getPermit() {
        return permit;
    }

    public void setPermit(String permit) {
        this.permit = permit;
    }
}

 

 

配置struts.xml

 

 

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="hellopkg" namespace="/hellons" extends="struts-default">
        <!--定义包级别拦截器,供包内action引用-->
        <interceptors>
            <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
        </interceptors>
        <action name="hi" class="com.tom.actions.HelloWorldAction">
            <!--引用权限检查拦截器,可以定义多个-->
            <interceptor-ref name="permissionCheckInterceptor"/>
            <result name="checkResult">/htmls/checkResult.jsp</result>
        </action>
    </package>
</struts>

 

 

定义checkResult.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title></title>
</head>
<body>
    Check Result: ${message}
</body>
</html>

 

访问:

1. http://localhost:8668/hellons/hi?permit=false

页面显示:Check Result: Permission denies

 

2. http://localhost:8668/hellons/hi?permit=true

页面显示:Check Result: Permission OK, the permit value is: null

 

问题:

 在访问http://localhost:8668/hellons/hi?permit=true时,结果显示permit的值为null,而根据Struts2的请求参数与Action字段的对应关系,value的值应该为true才对。这里为null表示Struts2并没有完成请求参数与action字段的自动绑定,原因是,当我们配置HelloWorldAction的拦截器时,把Struts2默认配置到Action的拦截器覆盖了,这其中就包括参数绑定拦截器

 

 问题解决

Struts2在配置拦截器时,采用的是一种递归的数据结构,拦截器栈interceptor-stack可以包含一组interceptor,interceptor-stack也可以包含interceptor-stack。

Struts2为每个Action默认配置的一组拦截器放置于名称为defaultStack的拦截器栈中。所以,当为Action配置拦截器时,需要把默认拦截器配置上,并且默认拦截器应该在最前,因为默认拦截器包含了Struts基础和核心功能,应该让这些拦截器优先执行。

 

修改后的struts2.xml

 

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="hellopkg" namespace="/hellons" extends="struts-default">
        <!--定义包级别拦截器,供包内action引用-->
        <interceptors>
            <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
        </interceptors>
        <action name="hi" class="com.tom.actions.HelloWorldAction">
            <!--配置默认拦截器-->
            <interceptor-ref name="defaultStack"/>
            <!--引用权限检查拦截器,可以定义多个-->
            <interceptor-ref name="permissionCheckInterceptor"/>
            <result name="checkResult">/htmls/checkResult.jsp</result>
        </action>
    </package>
</struts>

 此时访问http://localhost:8668/hellons/hi?permit=true,页面显示Check Result: Permission OK, the permit value is: true

 

 拦截器的其它配置方式

 1.定义并引用拦截器栈

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="hellopkg" namespace="/hellons" extends="struts-default">
        <!--定义包级别拦截器,供包内action引用-->
        <interceptors>
            <!--自定义拦截器-->
            <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>
            
            <!--拦截器栈-->
            <interceptor-stack name="permissionCheckInterceptorStack">
                <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->
                <!--默认拦截器-->
                <interceptor-ref name="defaultStack"/>
                <!--自定义拦截器-->
                <interceptor-ref name="permissionCheckInterceptor"/>
            </interceptor-stack>

        </interceptors>
        <action name="hi" class="com.tom.actions.HelloWorldAction">
            <!--拦截器栈包含默认拦截器和自定义拦截器-->
            <interceptor-ref name="permissionCheckInterceptorStack"/>
            <result name="checkResult">/htmls/checkResult.jsp</result>
        </action>
    </package>
</struts>

 

 2.定义默认拦截器

 

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="hellopkg" namespace="/hellons" extends="struts-default">
        <!--定义包级别拦截器,供包内action引用-->
        <interceptors>
            <!--自定义拦截器-->
            <interceptor name="permissionCheckInterceptor" class="com.tom.interceptors.PermissionCheckInterceptor"/>

            <!--拦截器栈-->
            <interceptor-stack name="permissionCheckInterceptorStack">
                <!---拦截器内部只能引用其它的拦截器(<interceptor-ref name=... ),而不能使用定义拦截器(<interceptor name=... )-->
                <!--默认拦截器-->
                <interceptor-ref name="defaultStack"/>
                <!--自定义拦截器-->
                <interceptor-ref name="permissionCheckInterceptor"/>
            </interceptor-stack>

        </interceptors>
        <default-interceptor-ref name="permissionCheckInterceptorStack"/>
        <action name="hi" class="com.tom.actions.HelloWorldAction">
            <!--不配置拦截器,则如果包内有default-interceptor-ref定义的拦截器,则使用之。default-interceptor-ref定义的拦截器必须包含defaultStack拦截器栈-->
            <!--如果配置了拦截器,则default-interceptor-ref定义的拦截器不生效,defaultStack定义的拦截器也不生效-->
            <result name="checkResult">/htmls/checkResult.jsp</result>
        </action>
    </package>
</struts>

 

【Struts2 四】Struts2拦截器

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,
包中的拦截器(可以拦截package中的所有的action) 如果某一个action中已经有了一个拦截器,那么pac
1、Struts2中使用拦截器来扩展Action的功能,往往是用来处理Action之间通用的事务,比如:记录日志
1、Struts2实现原理: 当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据
1. 理解拦截器 1.1. 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方
转自:http://www.blogjava.net/zhoumiao0123/archive/2008/08/10/221088.html 本文为本人翻译strut
在Action前用拦截器是直接return act.invoke()。只要把收尾操作放到act.invoke()和return result;之
在之前的文章中,我们已经涉及到了拦截器(Interceptor)的概念。 downpour 写道 拦截器是AOP中的概
转自http://blog.csdn.net/qjyong/article/details/1824607 Struts2 拦截器 (Interceptor) ++YONG
Struts2拦截器 Struts2拦截器(Interceptor) ++YONG原创,转载请注明 1. 理解拦截器 1.1. 什么是拦截
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号