首页 > 代码库 > Struts2 Interceptor学习

Struts2 Interceptor学习

Interceptor的设计思想,其实是Spring里面的AOP思想,尽管Struts2又有自己的Interceptor但是,在实际开发中,用的较少,SSH整合之后你可以采用AOP事务处理进行拦截,更方便

---------------------------------华丽的分割线---------------------------------------

从一个简单的DEMO入手,正常情况下,客户端可以直接访问我的Action,但是我不想让他们访问,就在Struts2和Action之间架设一道拦截器Interceptor。在用户直接访问我的Action时做出验证,看你是否已经用name="hh"的信息登陆(登录信息放在Session),如果已经登陆,启动拦截,不让你二次访问,如果没有登陆直接放行。

第一步:

MyInterceptor类要继承AbstractInterceptor父类,并实现intercept重载,代码如下:

package com.huohuo.interceptor;

import java.util.Map;

import org.apache.struts2.ServletActionContext;

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


public class MyInterceptor extends AbstractInterceptor {
    public String name;
    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        // TODO Auto-generated method stub
        
        String url = ServletActionContext.getRequest().getRequestURI().toString();
        System.out.println(url);
        Map session = ai.getInvocationContext().getSession();
        
        if(url.indexOf("loginAction")!=-1)
            {
            if(session.get("name")!=null)
                {
             name=session.get("name").toString();
             System.out.println("Interceptor"+name);
             if(name.equals("hh"))
                    {
                    return "interceptor";        //返回result name="interceptor"的JSP页面
} } } return ai.invoke(); //让程序继续执行 } }

第二步:

写LoginAction类

package com.huohuo.action;

import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport implements SessionAware{
    private String name;
    private Map<String,Object> session;
    
    public Map<String, Object> getSession() {
        return session;
    }
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public String execute()
    {
        session.put("name", name);
        System.out.println("action----"+name);
        return  SUCCESS;
    }
}

第三部:配置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>

     <constant name="struts.devMode" value="http://www.mamicode.com/true" />
     <!--Action配置  -->
     
     <package name="default" namespace="/" extends="struts-default">             //自定义拦截器和Action写在同一个package下
     <interceptors>
         <interceptor name="myInterceptor" class="com.huohuo.interceptor.MyInterceptor"></interceptor> //添加自己的拦截器
           <interceptor-stack name="myInterceptorStack">              //配置一个interceptor stack 
              <interceptor-ref name="myInterceptor"/>
                <interceptor-ref name="defaultStack"/>                  //这个必须要有,添加自己的拦截器会让默认的拦截器失效,所以要添加
          </interceptor-stack>
   </interceptors>
 
        <action name="loginAction" class="com.huohuo.action.LoginAction"> 
            <interceptor-ref name="myInterceptorStack"></interceptor-ref>      
            <result name="interceptor">/interceptor.jsp</result> 
            <result>/success.jsp</result>
            <result name="input">/input.jsp</result>           
        </action>
    </package>
    <!-- Add packages here -->
</struts>

第四步:配置好自己的JSP页面,就可以成功拦截。