Struts2自定义拦截器验证登录

 

【Struts2】☆★之Struts2自定义拦截器验证登录

 

 

       在实际项目中我们的方法都是需要验证登录状态的,所以在使用Struts2框架的项目中,自定义拦截器是一个不错的选择,本文就简单介绍如何使用拦截器,对全局方法进行验证登录状态!

 

第一步搭建Struts2开发环境

 

第二步:编写一个Action方法

package csg.struts2.action; 
/** 
 * 
 * @author 小夜的传说 
 * @2014-4-18 
 * @struts 
 * @csg.struts2.action 
 * @StrutsAction 
 * @2014-4-18上午1:03:37 
 */
public class StrutsAction { 
    private String message; 
    public String getMessage() { 
        return message; 
    } 
    public void setMessage(String message) { 
        this.message = message; 
    } 
    public String execute() { 
        message = "execute方法"; 
        return "success"; 
    } 
    public String addUI() { 
        message = "addUI方法"; 
        return "success"; 
    } 
}

 

  第三步写一个jsp视图模仿登录状态,只要访问这个jsp了,就把用户信息放在Session中代表已经登录,可以操作action方法,没有访问这个jsp代表没有登录,不可以操作任何方法

 

 

  

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>拦截器</title> 
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0"> 
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  </head> 
  <body> 
    <% 
    request.getSession().setAttribute("user", "login"); 
    %> 
    用户已登录 
  </body> 
</html>

 

第四步:配置struts.xml文件,先测试方法

 

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
<struts> 
    <package name="struts2" namespace="/test" extends="struts-default"> 
        <!-- 通配符形式访问action -->
        <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}"> 
            <result name="success">/WEB-INF/page/success.jsp</result> 
        </action> 
    </package> 
</struts>

 

第五步:部署到服务器上直接访问:http://127.0.0.1:8080/struts/test/list_addUI.action

会打印出addUI方法!ok,下面就是写一个拦截器了!

 

第六步:编写登录拦截器

 

package csg.struts2.interceptor; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.Interceptor; 
/** 
 * 
 * @author 小夜的传说 
 * @2014-4-18 
 * @struts 
 * @csg.struts2.interceptor 
 * @LoginInterceptor 
 * @2014-4-18上午1:03:29 
 */
public class LoginInterceptor implements Interceptor { 
    // 方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源 
    public void destroy() { 
    } 
    // 方法在拦截器被创建之后,在对Action镜像拦截之前调用,使用这个方法主要是给拦截器做类似初始化的操作 
    public void init() { 
    } 
    public String intercept(ActionInvocation invocation) throws Exception { 
        Object user = ActionContext.getContext().getSession().get("user"); 
        if (user != null) { 
            // 如果user不为null,代表用户已经登录,允许执行action中的方法 这个结果就代表返回验证通过 
            return invocation.invoke(); 
        } else { 
            //提示用户登录,我这里直接提示,在实际项目中,肯定会返回到登录页面 
            ActionContext.getContext().put("message", "你没有登录"); 
            return "success"; 
        } 
    } 
}

  第七步:最重要的,我们要在写好的struts.xml文件中,配置我们写好的这个拦截器,这一步,我会写的很详细,看懂的童鞋,拦截器基本上可以很好掌握

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
<struts> 
    <package name="struts2" namespace="/test" extends="struts-default"> 
        <interceptors> 
            <interceptor name="logininterceptor" class="csg.struts2.interceptor.LoginInterceptor"/> 
            <!-- 自定义一个拦截器栈,下面你拦截只需要用这个栈名字就行了 -->
            <interceptor-stack name="loginstack"> 
            <!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->
            <interceptor-ref name="defaultStack"/> 
            <!-- 这个引用你自己写的拦截器 -->
            <interceptor-ref name="logininterceptor" /> 
            </interceptor-stack> 
        </interceptors> 
        <!-- 这样写的意思是 在这个package包下面的所有action方法都需要拦截器 -->
        <default-interceptor-ref name="loginstack"></default-interceptor-ref> 
        <!-- 全局视图,这个就是说拦截到你没登录的时候提示你登录 ,你做的话可以提示返回登录界面-->
        <global-results> 
            <result name="success">/WEB-INF/page/message.jsp</result> 
        </global-results> 
        <!-- 通配符形式访问action -->
        <action name="list_*" class="csg.struts2.action.StrutsAction" method="{1}"> 
            <result name="success">/WEB-INF/page/success.jsp</result> 
            <!-- 也可以这样写 ,但是这样写就比较麻烦了,假如你下面还有action,这样你就每个action都需要引用,所以我注掉了-->
            <!-- <interceptor-ref name="loginstack"></interceptor-ref> -->
        </action> 
    </package> 
</struts>

 

第八步:解析

 

1、为什么<interceptor-ref name="defaultStack"/>

因为Struts2拦截器是个很奇诡的东西,当你自定义拦截器之后,在某个方法引用自己编写的拦截器之后,那么Struts许多的核心拦截器将无法使用,所以我们我们一般将自己写的拦截器和这个系统拦截器栈一起组成一个栈,这样就可以继续使用Struts2的拦截器了

可以参照struts源代码,在struts2-core-2.3.16.1.jar下面有个struts-default.xml文件,搜索defaultStack

如图:

wKioL1NQlPyzngGjAAKpjquV0yo427.jpg

 

 

2、配置全局拦截器的优缺点<default-interceptor-ref name="loginstack"></default-interceptor-ref>

假如,你某一个action方法需要另一个拦截器,但是其他方法不需要,这样你就需要在这个action中单独引用,注意,当你引用了这个拦截器之后,你定义的这个全局拦截器对于这个方法就会失效,所以一定要再次引用一次这个全局拦截器.

 

3、为什么系统拦截器栈写在你定义的拦截器之前

 

<!-- 这个是系统拦截器栈,不这样写,就是当你单独一个action引用拦截器的时候就无法使用拦截器的中的核心功能 -->
 <interceptor-ref name="defaultStack"/> 
 <!-- 这个引用你自己写的拦截器 -->
 <interceptor-ref name="logininterceptor" />
 
 

因为Struts在实例化的过程中读取的xml是从上到下的这样方式,所以本着项目安全角度,我们先让系统执行Struts2核心拦截器,然后再执行自己写的拦截器。当然你反过来写也行,但是可能有些自己写的复杂的拦截器在系统拦截器没实例化之前,会失效。

 

4、本文详细对于Struts2拦截器的基本原理进行了简单解析,如果有哪位童鞋有意见,欢迎举手!Thank you!

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值