简单的struts2拦截器利用session拦截用户登录
本人在实习项目时,在网上找到一个简单的拦截用户登录,总结一下:希望高手指点,继续进步和完善。
首先编写拦截类LoginedCheckInterceptor.java 如下:package com.huangt.interceptor;
Java代码 收藏代码
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.huangt.bean.SystemUser;
/* session过期、登录有效性及操作的权限验证拦截器 */
@SuppressWarnings(“serial”)
public class LoginedCheckInterceptor extends AbstractInterceptor {
/** 拦截请求并进行登录有效性验证 */
public String intercept(ActionInvocation ai) 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);
SystemUser systemUser = null;
//对登录与注销请求直接放行,不予拦截
if (url.indexOf(“login.action”)!=-1 || url.indexOf(“logout.action”)!=-1){
return ai.invoke();
}
else{
//验证Session是否过期
if(!ServletActionContext.getRequest().isRequestedSessionIdValid()){
//session过期,转向session过期提示页,最终跳转至登录页面
return “tologin”;
}
else{
systemUser = (SystemUser)ServletActionContext.getRequest().getSession().getAttribute(“systemUser”);
//验证是否已经登录
if (systemUser==null){
//尚未登录,跳转至登录页面
return “tologin”;
}else{
return ai.invoke();
}
}
}
}
}
然后用户登陆成功后,设置session的值。在LoginAction中登陆成功后加入一行:
Java代码 收藏代码
ActionContext.getContext().getSession().put(“systemUser”,systemUser);
<!–EndFragment–> <!—->
最为重要的便是struts.xml文件了,本人配置如下:
Java代码 收藏代码
<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE struts PUBLIC
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
“http://struts.apache.org/dtds/struts-2.0.dtd”>
<struts>
<package name=”struts2″ extends=”struts-default”>
<!– 配置自定义拦截器LoginedCheckInterceptor –>
<interceptors>
<interceptor name=”loginedCheck” class=”com.zjsoft.interceptor.LoginedCheckInterceptor”/>
<interceptor-stack name=”mystack”>
<interceptor-ref name=”loginedCheck” />
<interceptor-ref name=”defaultStack” />
</interceptor-stack>
</interceptors>
<!– 定义全局result –>
<global-results>
<!– 定义名为exception的全局result –>
<result name=”exception”>/exception.jsp</result>
<result name=”tologin” type=”redirect”>/unlogind.jsp</result>
</global-results>
<!– 定义全局异常映射 –>
<global-exception-mappings>
<!– 捕捉到Exception异常(所有异常)时跳转到exception所命名的视图上 –>
<exception-mapping exception=”java.lang.Exception” result=”exception”/>
</global-exception-mappings>
<!– 用户登录 –>
<action name=”login” class=”loginAction” >
<result name=”input” >/login.jsp</result>
<result name=”error” >/login.jsp</result>
<result name=”success” type=”redirect”>/index.jsp</result>
</action>
<action name=”logout” class=”com.zjsoft.action.LogoutAction” >
<result name=”success” type=”redirect”>/login.jsp</result>
</action>
<!– 系统用户信息管理 –>
<action name=”listSystemUser” class=”systemUserAction” method=”listSystemUser”>
<result name=”success”>/listSystemUser.jsp</result>
<interceptor-ref name=”mystack” />
</action>
</package>
</struts>
在每个需要拦截登录的action中加入<interceptor-ref name=”mystack” /> 便可。