struts.xml配置文件:
<package name="system-default" extends="struts-default" abstract="true"> <!-- struts2拦截器,拦截方法 --> <interceptors> <!-- 定义拦截器栈,所谓拦截器栈,是指由一个或多个拦截器组成 struts2 提供的拦截器栈,包含了struts2的很多核心拦截器 自己定义的放在最后面,struts2定义的放在前面 --> <interceptor-stack name="default-stack"> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 登录拦截器 --> <interceptor-ref name="webLoginInter"> <param name="excludeMethods"> toLogin, getSessionValiCode, login, toRegister, register, regAgreement, logout </param> </interceptor-ref> <!-- includeMethods表示包含指定的方法,即对标记为includeMethods的方法进行拦截,对应Action映射method --> </interceptor-stack> </interceptors> <default-interceptor-ref name="default-stack"></default-interceptor-ref> <global-results> <!--将cookie里的信息传递到login方法中进行自动登录--> <result name="login" type="redirectAction">> <param name="namespace">/info</param> <param name="actionName">login</param> <!--userInfo.loginName:userInfo是要跳转至的Action中的某一属性名,loginName是该userInfo对象里的某一字段名,花括号里的字段名,对应拦截器里自定义的"key"--> <param name="userInfo.loginName">${loginName}</param> <param name="userInfo.loginWord">${loginWord}</param> </result> </global-results> </package>
java(拦截器)代码:
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Map;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//可以继承 MethodFilterInterceptor ,也可以继承 AbstractInterceptor,此处两者都可以用
public class WebLoginInterceptor extends MethodFilterInterceptor{
private String excludeMethods;//在struts.xml中定义的参数,不拦截这些方法
public String getExcludeMethods() {
return excludeMethods;
}
public void setExcludeMethods(String excludeMethods) {
this.excludeMethods = excludeMethods;
}
//获取struts.xml中配置的不需要拦截的 methodName组,与当前请求的methodName进行匹配,如果包含则返回true
private boolean isExcludeMethods(String methodName)
{
boolean flag=false;
String [] excludeMethodsArray = excludeMethods.split(",");
for (int i = 0; i < excludeMethodsArray.length; i++) {
String excludeMethod=excludeMethodsArray[i].replace("\n", "").replace("\t", "").replace(" ", "");
if (methodName.equals(excludeMethod)) {
flag=true;
break;
}
}
return flag;
}
/*
*根据索引获取cookie中的信息,
*注意:在javascript中设置cookies时要先做encodeURIComponent(),不然一些特殊字符传到这里来会丢失
*/
private String getCookieByIndex(HttpServletRequest request,int index)
{
String returnStr="";
String nm="";
String psd="";
String invalidDate="";
String isLogin="";
try {
Cookie[] cookies=request.getCookies();
for(Cookie cookie : cookies)
{
//username 是cookie参数名(key)
if("username".equals(cookie.getName()))
{
//获取参数值
String userStr = new String(cookie.getValue());
//客户端做过encode,这里要decode
userStr=URLDecoder.decode(userStr,"UTF-8");
//此处根据自己业务来,当前项目是用以下特殊符号将用户名密码等信息分割开来放在一个参数中,所以才这样写
if (userStr!=""){
int index1 = userStr.indexOf("%%");
int index2 = userStr.indexOf("&&");
int index3 = userStr.indexOf("##");
if(index1>-1)
{
nm=userStr.substring(0,index1);
if(index2>-1)
{
psd=userStr.substring(index1+2,index2);
}
}
if(index3>-1)
{
if(index2>-1)
{
invalidDate=userStr.substring(index2+2,index3);
}
isLogin= userStr.substring(index3+2);
}
}
break;
}
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//用户名
if(index==1)
{
returnStr=nm;
}
//密码
if(index==2)
{
returnStr=psd;
}
//失效日期
if(index==3)
{
returnStr=invalidDate;
}
//是否登录
if(index==4)
{
returnStr=isLogin;
}
return returnStr;
}
//用户未登录的情况下,拦截非ajax请求,根据cookie里的相关信息进行自动登录
@Override
public String doIntercept(ActionInvocation actionInvocation) throws Exception {
String result = null;
try {
Map<String,Object> session = ActionContext.getContext().getSession();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//获取请求Namespace
String namespace = actionInvocation.getProxy().getNamespace();
//获取请求ActionName
String actionName = actionInvocation.getProxy().getActionName();
//获取请求Method
String method = actionInvocation.getProxy().getMethod();
//获取请求方法
String name = actionInvocation.getInvocationContext().getName();
//获取请求参数
Map<String,Object> params = actionInvocation.getInvocationContext().getParameters();
//被拦截URL地址
String url=request.getScheme()+"://";
url+=request.getHeader("host");
url+=request.getRequestURI();
if(request.getQueryString()!=null){
url+="?"+request.getQueryString();
}
//从session中得到userInfo
if(userInfo==null)
{
//过滤不需要拦截的方法名
if(isExcludeMethods(method)==true)
{
return actionInvocation.invoke();
}
//由于ajax请求不受控(不会根据返回的result进行跳转),因此只对http请求做处理
if(request.getHeader("X-Requested-With") == null || !request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest"))
{
//获取cookie里的值,判断是否满足自动登录的条件,满足就自动登录
String nm=getCookieByIndex(request,1);
String psd=getCookieByIndex(request,2);
String isLogin= getCookieByIndex(request,4);
//用户名密码不为空,且用户勾选过自动登录
if("1".equals(isLogin) && !"".equals(nm) && !"".equals(psd))
{
log.info("action name:" + actionInvocation.getAction());
log.info("functional action name:" + actionName);
log.info("使用cookie中保存的用户信息进行自动登录...");
///!!!!此处是关键
//将用户名密码存入值栈中,以便于传递到其他的Action,对应struts.xml中的配置
actionInvocation.getStack().set("loginName", nm);
actionInvocation.getStack().set("loginWord", psd);
//重定向到UserInfoAction的login方法中,login方法是一个登录方法,转到这个方法之后,会进行正常的登录操作
return "login";
}
}
}
result = actionInvocation.invoke();
} catch (Exception e) {
actionInvocation.getInvocationContext().put("errorMsg", e.getMessage());
e.printStackTrace();
}
return result;
}
}
javascript代码:
就两个方法 1.设置cookie 2.获取cookie 对 document.cookie 的值来进行读、写就可以了 写入时记得要encodeURIComponent() 读取时记得要decodeURIComponent()