struts2注解下的拦截器配置

   貌似这个这问题已经纠结了半年了,网上找资料也不是很多。上周六调试通了。借CSDN mark一下吧。

一  、实现

1、 首先上拦截器部分的代码

  1. public class CheckLoginInterceptor extends AbstractInterceptor {  
  2.   
  3.     private static final long serialVersionUID = 1L;  
  4.     public static final String USER_SESSION_KEY = "user";  
  5.     private Logger LOG = Logger.getLogger(CheckLoginInterceptor.class);  
  6.   
  7.     @Override  
  8.     public String intercept(ActionInvocation actionInvocation) throws Exception {  
  9.         LOG.info("begin check login interceptor");  
  10.         // 对LoginAction不做该项拦截  
  11.         Object action = actionInvocation.getAction();  
  12.         if (action instanceof LoginAction) {  
  13.             LOG.info("exit check login, because this is login action.");  
  14.             return actionInvocation.invoke();  
  15.         }  
  16.         // 验证 session  
  17.         Map<String, Object> session = ActionContext.getContext().getSession();  
  18.         String username = (String) session.get(USER_SESSION_KEY);  
  19.         LOG.info("username-----------" + username);  
  20.         if (username != null) {  
  21.             // 存在的情况下进行后续操作。  
  22.             LOG.info(username + " already login!");  
  23.             return actionInvocation.invoke();  
  24.         } else {  
  25.             // 否则终止后续操作,返回LOGIN  
  26.             LOG.info("no login, forward login page!");  
  27.             return Action.LOGIN;  
  28.         }  
  29.     }  
  30. }  

2、然后就是struts.xml的内容

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="custom-default" extends="struts-default">  
  7.         <!-- 继承默认的 struts2 配置文件 -->  
  8.         <interceptors>  
  9.             <interceptor name="checkLogin"  
  10.                 class="com.cmcc.intt.util.CheckLoginInterceptor" />  
  11.             <interceptor-stack name="checkLoginStack">  
  12.                 <interceptor-ref name="checkLogin"></interceptor-ref>  
  13.                 <interceptor-ref name="defaultStack"></interceptor-ref>  
  14.             </interceptor-stack>  
  15.         </interceptors>  
  16.         <!-- 设置全局 全局默认的拦截器栈-->  
  17.         <default-interceptor-ref name="checkLoginStack"></default-interceptor-ref>  
  18.         <!-- 定义全局Result -->  
  19.         <global-results>  
  20.             <!-- 当返回login视图名时,转入/login.jsp页面 -->  
  21.             <result name="login">/login.jsp</result>  
  22.         </global-results>  
  23.     </package>  
  24. </struts>  


3、LoginAction的代码(只上关键部分,下面也一样)

  1. @ParentPackage("custom-default")  
  2. @InterceptorRefs(@InterceptorRef("checkLoginStack"))  
  3. @Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),  
  4.         @Result(name = "input", location = "/login.jsp") })  
  5. public class LoginAction extends ActionSupport {  
  6.     public String param = null;  
  7.     private static final long serialVersionUID = -7146549074248299166L;  
  8.     private Logger LOG = Logger.getLogger(LoginAction.class);  
  9.   
  10.     public String execute() {  
  11.         LOG.info(param);  
  12.         Map<String, Object> session = ActionContext.getContext().getSession();  
  13.         if (param.equals("1")) {  
  14.             session.put("user""123");  
  15.             return SUCCESS;  
  16.         } else {  
  17.             session.remove("user");  
  18.             return "input";  
  19.         }  
  20.     }  
  21.  (public getter  and setter  ………………)  
  22. }  
附 通过http://localhost:8080/intt/config-browser/index.action   看此action的Action information如下:

Results    
NameTypeParameters
inputorg.apache.struts2.dispatcher.ServletDispatcherResultlocation = /login.jsp
successorg.apache.struts2.dispatcher.ServletDispatcherResultlocation = /redirect.jsp
loginorg.apache.struts2.dispatcher.ServletDispatcherResultlocation = /login.jsp

  Interceptors  
NameType
CheckLoginInterceptorcom.cmcc.intt.util.CheckLoginInterceptor
……(18个defaultstack的拦截器的第一个)……………………
……(18个defaultstack的拦截器的第二个)…………
……(18个defaultstack的拦截器的第三个)…………

可以看到  此action继承了custom-default中定义的login以及CheckLoginInterceptor这个拦截器



4、最后是仿业务逻辑的 代码


  1. @ParentPackage("custom-default")  
  2. @InterceptorRefs(@InterceptorRef("checkLoginStack"))  
  3. @Results( { @Result(name = SUCCESS, location = "/redirect.jsp"),  
  4.         @Result(name = "input", location = "/login.jsp") })  
  5. public class SignAction extends ActionSupport {  
  6.     private static final long serialVersionUID = -1326137892057921638L;  
  7.   
  8.     public String execute() {  
  9.         System.out.println("SignAction.execute");  
  10.         return SUCCESS;  
  11.     }  
  12. }  

  此action的Action information的跟LoginAction一样,就不说了


二  执行过程  

1 模仿已登录 

http://localhost:8080/intt/login?param=1  模仿登录(1),完成后浏览http://localhost:8080/intt/sign 则显示 “already login!” (2)

(1)console 显示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 显示"begin check login interceptor   username-----------123   123 already login!"

2 模仿未登录

http://localhost:8080/intt/login?param=2  模仿登录(1)。 完成后浏览http://localhost:8080/intt/sign 则显示 “please login” (2)

(1)console 显示 “begin check login interceptor    exit check login, because this is login action.”

(2)console 显示"begin check login interceptor   username-----------null    no login, forward login page!     Forwarding to location /login.jsp"

  

三    总结

                在util包中写入类似CheckLoginInterceptor 这样的拦截器代码。然后在struts.xml中新增一个package 建立拦截器栈。建好后在action的parentpackage中继承此package并且拦截器要填入刚才新建的拦截器栈。

                     如果你在新增的package定义LoginAction 的跳转映射。对不起哦,这样做是不行滴。但是如果你把注解的两个包( struts2-config-browser-plugin-2.2.1.jar, struts2-convention-plugin-2.2.1.jar)拿掉就行了。但这样一做,就不是注解了撒。


四  运行环境

                   下面我把我的运行环境的 jar包贴出来吧

1)        commons-fileupload-1.2.2.jar

2)        commons-io-1.3.2.jar

3)        commons-lang-2.3.jar

4)        commons-logging-1.1.1.jar

5)        freemarker-2.3.16.jar

6)        javassist-3.11.0.GA.jar

7)        log4j-1.2.16.jar

8)        ognl-3.0.1.jar

9)        struts2-config-browser-plugin-2.2.1.jar

10)    struts2-convention-plugin-2.2.1.jar

11)    struts2-core-2.2.1.jar

12)    xwork-core-2.2.1.jar


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值