几近每一个J2EE的项目都会触及用户模块,只要触及到就有用户登陆登出及其session的1些管理和判断,我之前也写过很多关于这方面的代码,只是写但没做总结,今天就做1次简单的总结,也方便新人学习或鉴戒.好了空话不多说,言回正题.
今天主要是讲授的是struts2对session的判断和拦截.
首先我们在struts的xml配置文件写入拦截器的配置信息,以下:
<package name="struts2" namespace="/" extends="struts-default">
<!-- 定义1个拦截器 -->
<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>
代码所示,我定义了1个名字为struts2的package,里面定义了拦截器interceptors和全局视图的跳转,在拦截器中定义了1个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")!=⑴ || url.indexOf("logout")!=⑴){
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>
比如这是我定义的1个登录的xml配置,由于我不是与拦截器写在同1package下的,所以,但我这里需要用到之前的拦截器,需要把当前另起的package继承拦截器所属的package,具体代码在packge的extends填入拦截器的package的name就好了,继承1说罢了,然后再每一个需要拦截判断的action里加上这句配置就好了,如果是直接写在拦截器的package就直接用就好了,不存在继承,呵呵
<interceptor-ref name="mystack" />
好了,就说到这里吧,不明白的同学或,有更好的建议可以给我留言,感谢浏览本篇文章,转发请标明出处,谢谢