返回列表 发帖

[原创] [原创]Struts2 拦截器浅析

Struts2的拦截器采用的是AOP的思想,但是有人说拦截器能完成的工作servletfilter也能完成。其实,struts2的拦截器更能显示出软件复用的思想。
struts2的配置文件struts.xml中,每个package都有一个默认的拦截器,在默认的情况下会引用此拦截器。如果我们需要采用自己定义的拦截器时必须先引用默认的拦截器,因为,自己定义的拦截器会覆盖默认的拦截器,如果不引用的话会出现错误,不如下面的代码片断先引用了默认的拦截器:

           <interceptor-ref name="defaultStack"/>
           <interceptor-ref name="authority"/>

多个拦截器可以组成一个拦截器链,拦截器链的使用就如同一个拦截器一样,这体现了复用的思想。
如果在某个package中的每个Action都需要调用同一个拦截器,则可以将此拦截器与默认的拦截器组合成一个拦截器链,方便调用,因为使用自己定义的拦截器可以覆盖默认的拦截器。

下面举一个简单的例子:
登陆的LoginAction
package com.hopeteam.struts.actions;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action{
    private String username;
    private String password;
    
    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
       this.username = username;
    }
    public String getPassword() {
       return password;
    }
    public void setPassword(String password) {
       this.password = password;
    }
    
    public String execute() throws Exception
    {
       if (getUsername().equals("fengzhizi")
              && getPassword().equals("123456"))
       {
           ActionContext.getContext().getSession().put("user", getUsername());
           return SUCCESS;
       }
       else
           return ERROR;
    }
}

权限拦截器
package com.hopeteam.struts.Interceptor;

import java.util.Map;

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

public class AuthorityInterceptor extends AbstractInterceptor{
    public String intercept(ActionInvocation invocation)throws Exception
    {
       ActionContext ctx = invocation.getInvocationContext();
       Map session = ctx.getSession();
      
       String user =(String)session.get("user");
       if(user!=null && user.equals("fengzhizi"))
       {
           return invocation.invoke();
       }
       ctx.put("tip", "您还没登陆,请输入正确的用户名和密码!");
      
       return Action.LOGIN;
    }
}


在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="fengzhizi" extends="struts-default">
       <interceptors>
           <interceptor name="authority" class="com.hopeteam.struts.Interceptor.AuthorityInterceptor"/>
       </interceptors>
      
       <global-results>
            <result name="login">/login.jsp</result>
       </global-results>
      
       <action name="Login"
           class="com.hopeteam.struts.actions.LoginAction">
           <result name="error">/error.jsp</result>
           <result name="success">/welcome.jsp</result>

       </action>
       <action name="interceptorAction">

            <result>/WEB-INF/jsp/test.jsp</result>
           <!-- 拦截器一般配置在result元素之后! -->
           <interceptor-ref name="defaultStack"/>
           <interceptor-ref name="authority"/>
        </action>
    </package>
</struts>

来看一下运行的效果图,这是没登陆之前,想访问“测试Struts2拦截器”

这是登陆以后的界面

这是访问“测试Struts2拦截器”的界面

附件:
天行健,君子以自强不息
地势坤,君子以厚德载物
   黑色海岸线欢迎您

返回列表 回复 发帖