struts2拦截器之用户session判断

        几乎每个J2EE的项目都会涉及用户模块,只要涉及到就有用户登陆登出及其session的一些管理和判断,我以前也写过很多关于这方面的代码,只是写但没做总结,今天就做一次简单的总结,也方便新人学习或者借鉴.好了废话不多说,言回正题.

        今天主要是讲解的是struts2对session的判断和拦截.

首先我们在struts的xml配置文件写入拦截器的配置信息,如下:

         <package name="struts2" namespace="/" extends="struts-default">
		<!-- 定义一个拦截器 -->
		<interceptors>
			<!-- 权限拦截器 <interceptor name="authority" class="com.smartsoft.interceptor.AuthorityIterceptor"> </interceptor> -->
			<!-- session拦截器-->
			<interceptor name="sessionout" class="com.smartsoft.interceptor.SessionIterceptor"></interceptor>
			<!-- 拦截器栈 -->
			<interceptor-stack name="mystack">
				<interceptor-ref name="defaultStack" />
				<!-- 权限拦截 <interceptor-ref name="authority" /> -->
				<!-- session拦截-->
				<interceptor-ref name="sessionout" />
			</interceptor-stack>
		</interceptors>

		<!-- 定义全局Result -->
		<global-results>
			<!-- 当返回login视图名时,转入/login.jsp页面 -->
			<result name="toLogin">/login.jsp</result>
		</global-results>
	</package>

代码所示,我定义了一个名字为struts2的package,里面定义了拦截器interceptors和全局视图的跳转,在拦截器中定义了一个sessionout,便是我们的session判断功能,他指向class如下:

package com.smartsoft.interceptor;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.smartsoft.model.User;
import com.smartsoft.util.Constants;

public class SessionIterceptor extends AbstractInterceptor {
    @Override  
    public String intercept(ActionInvocation actionInvocation) throws Exception {  
    	//取得请求的URL  
        String url = ServletActionContext.getRequest().getRequestURL().toString();  
        HttpServletResponse response=ServletActionContext.getResponse();  
        response.setHeader("Pragma","No-cache");            
        response.setHeader("Cache-Control","no-cache");     
        response.setHeader("Cache-Control", "no-store");     
        response.setDateHeader("Expires",0);  
        User loginUser = null;  
        //对登录与注销请求直接放行,不予拦截  
        if (url.indexOf("login")!=-1 || url.indexOf("logout")!=-1){  
            return actionInvocation.invoke();  
        }  
        else{  
            //验证Session是否过期  
            if(!ServletActionContext.getRequest().isRequestedSessionIdValid()){  
                //session过期,转向session过期提示页,最终跳转至登录页面  
            	System.out.println("session过期");
                return "toLogin";  
            }  
            else{  
            	loginUser = (User)ServletActionContext.getRequest().getSession().getAttribute(Constants.USER_SESSION);  
                //验证是否已经登录  
                if (loginUser==null){  
                    //尚未登录,跳转至登录页面  
                    return "toLogin";  
                }else{                      
                    return actionInvocation.invoke();  
                }                  
            }              
        }   
    }  
}

以上代码逻辑比较简单,获取当前session的用户,并判断他是否存在,以此作为根据判断他是否在登陆状态,是则放行,否则调到实现定义好的登录界面

以上只是拦截器的整定义过程,何如才能把他运用到我们需要的连接上呢?具体还需要在每个struts的action上加上如下配置才可以,比如

        <package name="db" namespace="" extends="struts2">
		<action name="index" method="index" class="com.smartsoft.action.IndexAction">
			<result>/index.jsp</result>
			<interceptor-ref name="mystack" />  
		</action>
		<action name="login" method="login " class="com.smartsoft.action.IndexAction">
			<result type="redirect">index</result>
			<interceptor-ref name="mystack" />  
		</action>
	</package>

比如这是我定义的一个登录的xml配置,因为我不是与拦截器写在同一package下的,所以,但我这里需要用到之前的拦截器,需要把当前另起的package继承拦截器所属的package,具体代码在packge的extends填入拦截器的package的name就行了,继承一说罢了,然后再每个需要拦截判断的action里加上这句配置就行了,如果是直接写在拦截器的package就直接用就行了,不存在继承,呵呵

<interceptor-ref name="mystack" />

好了,就说到这里吧,不明白的同学或者,有更好的建议可以给我留言,感谢阅读本篇文章,转发请标明出处,谢谢



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值