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就直接用就行了,不存在继承




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值