`

[原]Struts2-拦截器

阅读更多

[标题]:[原]Struts2-拦截器
[时间]:2009-7-31
[摘要]:Struts Interceptor
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,Interceptor,拦截器,动态代理,Java,Proxy
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
1、知识点
a.Struts2拦截器Interceptor
    Struts2拦截器的根接口为: xwork-2.1.2.jar/com.opensymphony.xwork2.interceptor.Interceptor
    自定义的拦截器可以实现Interceptor接口。com.opensymphony.xwork2.interceptor.AbstractInterceptor 提供了对Interceptor的默认实现,自定义拦截器也可以继承AbstractInterceptor。

b.定义拦截器
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyInterceptor.java:

package wintys.struts2.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 拦截器、Interceptor
 *
 * http://www.blogjava.net/wintys
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-30
 *
 */
@SuppressWarnings("serial")
public class MyInterceptor implements Interceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        
        System.out.println("before...");
        
        String result = invocation.invoke();
        
        System.out.println("after...");
        
        return result;
    }

    @Override
    public void destroy() {
        System.out.println("MyInterceptor destroy()...");
    }

    @Override
    public void init() {
        System.out.println("MyInterceptor init()...");
    }

}


c.在struts.xml中配置拦截器

<package name="MyStruts" extends="struts-default">
    <interceptors>
            <interceptor name="myInterceptor" class="wintys.struts2.interceptor.MyInterceptor" />

            <interceptor-stack name="myStack">
                <interceptor-ref name="myInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
    </interceptors>
    ......
    <action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
        <result name="success">/interceptor/output.jsp</result>
           <result name="input">/interceptor/input.jsp</result>
        <interceptor-ref name="myStack" />
    </action>
</package>


    defaultStack是Struts默认的拦截器。在action中手动引入interceptor后,就不会启用默认的interceptor,除非手动引入。所以要加上默认interceptor:<interceptor-ref name="defaultStack">。

    在input.jsp请求Action "intercept"时,在Action的execute()方法执行时,就会触发拦截器。

d.带参数的拦截器
    配置(在定义时给参数赋值):
    <interceptor name="myParamInterceptor" class="wintys.struts2.interceptor.MyParamInterceptor" >
        <param name="info ">This is a param.</param>
    </interceptor>

    在自定义拦截器中实现代码(添加info属性、setter和getter):
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyParamInterceptor.java

package wintys.struts2.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * 带参数的拦截器、AbstractInterceptor
 *
 * http://www.blogjava.net/wintys
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-30
 *
 */
@SuppressWarnings("serial")
public class MyParamInterceptor extends AbstractInterceptor {
    private String info ;
    
    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("before2...");
        System.out.println("info:" + info );
        
        String result = invocation.invoke();
        
        System.out.println("after2...");
        
        return result;
    }

}


    在引用时给参数赋值,会覆盖定义时的赋值:
    <interceptor-ref name="myParamInterceptor">
        <param name="info ">This is another param.</param>
    </interceptor-ref>


e.拦截器栈
    拦截器栈与拦截器具有同等地位,使用相同。拦截器栈可以再包含拦截器或拦截器栈。
<interceptors>
    <interceptor-stack name="myStack">
        <interceptor-ref name="myInterceptor" />
        <interceptor-ref name="defaultStack" />
    </interceptor>
</interceptors>

    拦截器栈中定义的多个拦截器执行顺序与拦截器配置顺序相同。同时,多个拦截器的执行流程如下: interceptorA begin => interceptorB begin => action => interceptorB end => interceptorA end


f.指定默认拦截器    
    Struts默认的拦截器是defaultStack,可以在struts.xml中使用如下配置重新指定默认拦截器:
<package>
    ......
    <default-interceptor-ref name="myStack" />
    ......
</package>


g.方法过滤拦截器MethodFilterInteceptor
    MethodFilterInteceptor可以选择需要过滤的方法,通过参数进行配置。实现MethodFilterInteceptor.doIntercept(),以提供拦截功能。
<action>
    <interceptor-ref name="myInterceptor">
        <param name="includeMethods">test,execute</param>
        <param name="excludeMethods">somemethod</param>
    </interceptor-ref>
</action>


f.PreResultListener
    可以在拦截器中添加PreResultListener,以实现特定功能。PreResultListener在业务方法(通常为execute)返回后(执行成功则返回"success"),页面视图呈现到客户端之前执行。

    public String intercept(ActionInvocation invocation) throws Exception {
        ......
        invocation.addPreResultListener(...);
        ......
    }


2、详细代码
/StrutsHelloWorld/src/wintys/struts2/interceptor/MyMethodFilterInterceptor.java:

package wintys.struts2.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.opensymphony.xwork2.interceptor.PreResultListener;

/**
 * 选择性拦截方法的拦截器MethodFilterInterceptor、监听器PreResultListener
 *
 * http://www.blogjava.net/wintys
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-30
 *
 */
@SuppressWarnings("serial")
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        System.out.println("MyMethodFilterInterceptor is running...");
        
        //添加监听器PreResultListener
        invocation.addPreResultListener (new PreResultListener(){
            public void beforeResult(ActionInvocation invocation, String resultCode){
                System.out.println("PreResultListener ..." + resultCode);
            }
            
        });
        
        String result = invocation.invoke();        
        
        return result;
    }

}



/StrutsHelloWorld/WebRoot/interceptor/input.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
 
  <body>
  <s:form action="intercept">
      <s:textfield name="user" label="user" /><br/>
      <s:submit name="submit" label=" 提交  " />
  </s:form>
    
  </body>
</html>




/StrutsHelloWorld/src/wintys/struts2/interceptor/InterceptAction.java:

package wintys.struts2.interceptor;

import com.opensymphony.xwork2.ActionSupport;

/**
 *
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-30
 * http://www.blogjava.net/wintys
 */
@SuppressWarnings("serial")
public class InterceptAction extends ActionSupport {
    private String user;

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }
    
    @Override
    public String execute() throws Exception {
        System.out.println("execute()...");
        
        return SUCCESS;
    }
    
    @Override
    public void validate() {
        System.out.println("validate()...");
        
        if(user == null || user.length() < 6){
            addFieldError("user", "invalid user");
        }
    }
}




/StrutsHelloWorld/WebRoot/interceptor/output.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'output.jsp' starting page</title>    
 </head>
 
  <body>
    <s:property value="user"/>
  </body>
</html>



/StrutsHelloWorld/src/struts.xml:

<?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="MyStruts" extends="struts-default">
        <!-- 拦截器 -->
        <interceptors>
            <interceptor name="myInterceptor" class="wintys.struts2.interceptor.MyInterceptor" />
            <interceptor name="myParamInterceptor" class="wintys.struts2.interceptor.MyParamInterceptor" >
                <param name="info">This is a param.</param>
            </interceptor>
            <interceptor name="myMethodFilterInterceptor" class="wintys.struts2.interceptor.MyMethodFilterInterceptor">
                <param name="includeMethods">execute</param>
            </interceptor>
            
            <interceptor-stack name="myStack">
                <interceptor-ref name="myParamInterceptor">
                    <param name="info">This is another param.</param>
                </interceptor-ref>
                <interceptor-ref name="myInterceptor"/>
                <interceptor-ref name="myMethodFilterInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
              
        <action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
            <result name="success">/interceptor/output.jsp</result>
               <result name="input">/interceptor/input.jsp</result>
               <interceptor-ref name="myStack" />
        </action>
        
    </package>
</struts>


3、小例子:登录拦截
    登录拦截:拦截Action实现在输入信息之前必须登录,如果没有登录,则转到登录页面。

/StrutsHelloWorld/WebRoot/interceptor/login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
 
  <body>
  <s:form action="authentication">
    正确id:10000
      <s:textfield name="id" label="id" /><br/>
      <s:submit name="submit" label=" 提交  " />
  </s:form>
    
  </body>
</html>


Struts2中的Session可以脱离容器,以方便测试,对应于容器中的Session。

/StrutsHelloWorld/src/wintys/struts2/interceptor/AuthenticationAction.java:

package wintys.struts2.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class AuthenticationAction extends ActionSupport {
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    
    @Override
    public String execute() throws Exception {
        
        if( id.equals("10000")){
            Map<String , Object> map = ActionContext.getContext().getSession() ;
            map.put("id", id);
            
            return SUCCESS;
        }
        else{
            addFieldError("id", "id error");
            
            return INPUT;
        }
    }
    
    @Override
    public void validate() {
        if(id == null || id.length() < 3)
            addFieldError("id", "invalid id");
    }
}



/StrutsHelloWorld/src/wintys/struts2/interceptor/AuthenticationInterceptor.java:

package wintys.struts2.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * 认证拦截器:判断用户是否已登录
 *
 * http://www.blogjava.net/wintys
 * @author Winty (wintys@gmail.com)
 * @version 2009-07-30
 *
 */
@SuppressWarnings("serial")
public class AuthenticationInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("AuthenticationInterceptor ...");
        
        Map<String , Object> map = invocation.getInvocationContext().getSession() ;
        
        Object id = map.get("id");
        if( id == null){
            return Action.LOGIN ;
        }else{
            System.out.println("id" + id);
            
            return invocation.invoke();
        }
    }

}



struts.xml配置:

......
<package name="MyStruts" extends="struts-default">
        <!-- 拦截器 -->
        <interceptors>
            <interceptor name="authenticationInterceptor" class="wintys.struts2.interceptor.AuthenticationInterceptor"/>
            
            <interceptor-stack name="myStack">
                <interceptor-ref name="authenticationInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        
        <!-- 全局result -->
        <global-results>
            <result name="login" type="redirect">/interceptor/login.jsp</result>
        </global-results>
        
        <action name="intercept" class="wintys.struts2.interceptor.InterceptAction">
            <result name="success">/interceptor/output.jsp</result>
               <result name="input">/interceptor/input.jsp</result>
               <interceptor-ref name="myStack" />
        </action>
        <action name="authentication" class="wintys.struts2.interceptor.AuthenticationAction">
            <result name="success">/interceptor/input.jsp</result>
            <result name="input" type="dispatcher" >/interceptor/login.jsp</result>
        </action>
        
</package>
......


[参考资料]:
    《浪曦视频之Struts2应用开发系列》

[附件]:
    源代码: struts_HelloWorld_Interceptor.zip

分享到:
评论

相关推荐

    struts2-016/017漏洞解决

    使用预定义的拦截器或自定义拦截器来检查和清理输入。 4. **安全编码实践**:遵循安全编码的最佳实践,避免在应用程序中直接使用不受信任的数据。尽量避免使用可能导致代码执行的OGNL表达式,除非已经进行了充分的...

    [原]Struts2-深入探索

    这篇博客“[原]Struts2-深入探索”可能是对Struts2框架的深度剖析,涵盖了其核心概念、配置、拦截器、结果类型等关键组件。 首先,Struts2的核心概念包括Action和Result。Action是业务逻辑的载体,它负责处理用户...

    struts2- 2.3.15.3 spring3.2.4 mybatis-3.2.3 通用分页(不同数据库) 拦截器

    拦截器在Struts2中扮演着重要角色,它们是AOP的一种实现,可以在Action执行前后插入额外的处理逻辑,如日志记录、权限验证、事务管理等。在分页场景下,拦截器可以用来处理分页参数,如当前页数和每页显示的条目数,...

    [原]Struts2-入门与配置

    Struts2的拦截器机制是其灵活性的关键。拦截器可以实现日志记录、权限检查、事务管理等功能。开发者可以自定义拦截器并将其插入到默认的拦截器栈中。 3. **结果与视图** 结果负责将Action执行的结果导向到合适的...

    整合struts2-spring3-MyBatis3

    1. **配置Struts2**:首先,我们需要在项目的web.xml中配置Struts2的核心过滤器,定义全局的常量和拦截器栈。 2. **集成Spring**:将Spring作为应用的IoC容器,通过Struts2的插件实现Spring与Struts2的整合。这包括...

    [原]Struts2-国际化

    在Struts2中,我们首先需要在`struts.xml`配置文件中配置拦截器栈,添加`i18n`拦截器。这个拦截器负责处理请求中的locale参数,并设置合适的语言环境。配置示例如下: ```xml ...

    [原]Struts2-文件上传与下载

    要实现文件上传,你需要在Struts2配置文件中添加相关的拦截器栈,如`params`和`fileUpload`拦截器。`fileUpload`拦截器负责解析多部分请求并存储上传的文件到临时目录。 在Action类中,你需要定义一个字段来接收...

    saif(struts1 interceptor)

    2. **拦截器配置**:配置拦截器通常需要在struts-config.xml配置文件中进行,定义拦截器的类名、参数以及拦截器链的顺序。这使得开发者可以根据项目需求灵活调整拦截器的行为。 3. **自定义拦截器**:开发者可以...

    低版本struts2升级高版本避免漏洞方案

    Struts2是一个基于Java的开源Web应用框架,它继承了Struts1的优点,并在此基础上增加了许多新特性,如拦截器(Interceptor)、结果类型(Result Type)等。Struts2框架通过简化开发过程并提供一系列强大的功能,帮助...

    struts2 json

    这个插件提供了一组拦截器和结果类型,使得Action可以直接返回JSON响应。 2. **xwork-core-2.1.6.jar**:这是Struts2的核心库,包含了Action、Interceptor等关键组件。它为Struts2框架提供了基础架构和工作流。 3....

    原创struts2讲义2.pdf

    拦截器是Struts2中的一个重要特性,它允许开发者在Action执行前后添加自定义的行为,比如身份验证、数据校验等。通过配置文件可以轻松地控制哪些Action需要经过哪些拦截器。 **1.2.3 FilterDispatcher与Action映射*...

    struts2+json

    总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。

    struts拦截器实现等待页面

    Struts拦截器(Interceptor)是基于Java的Spring MVC和Struts2框架的一种设计模式,它在请求被控制器处理之前和之后执行特定的操作。在SSH(Struts2、Spring、Hibernate)系统中,拦截器用于增强应用程序的功能,...

    struts2 in action 中文版 英文版 源代码 合集

    3. **拦截器**: 拦截器是Struts2的一个强大特性,它们在Action执行前后进行拦截,实现日志记录、权限检查、数据验证等功能,增强了框架的扩展性。 4. **插件**: Struts2支持众多插件,如Struts2-dojo-plugin用于...

    struts-1.2.9-modify-by-selfimpr.jar

    - **Interceptor拦截器**:Struts 1支持拦截器,开发者可能添加了新的拦截器以实现特定的功能,如权限控制、日志记录等。 - **Plug-in插件**:自定义版本可能包含自定义插件,以扩展Struts的功能。 2. **工具集成...

    Struts2之Action接收请求参数和拦截器详解

    Struts2之Action接收请求参数和拦截器详解 Struts2框架中的Action接收请求参数和拦截器详解是非常重要的知识点,本文将详细介绍Struts2之Action接收请求参数和拦截器详解的相关知识点。 一、Struts2框架中的Action...

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 ...09 自定义拦截器 38 10 类型转换 38 Struts2总结 39

    struts2中AJAX实现

    5. **Struts2拦截器**:Struts2的拦截器机制允许在Action调用前后执行特定逻辑。在AJAX场景中,可能需要使用一些特定的拦截器,如`params`拦截器用于参数绑定,`validation`拦截器进行数据验证,或者自定义拦截器...

    Struts2所有课件(原代码+注释)-->1

    在“Struts2所有课件(原代码+注释)--&gt;1”中,我们可以期待学习到关于Struts2框架的核心概念、配置、动作、拦截器、结果类型等全面知识。 1. **核心概念**: - **Action类**:它是处理用户请求的核心,负责执行...

Global site tag (gtag.js) - Google Analytics