public class MyInterceptor extends com.opensymphony.xwork2.interceptor.Interceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//<action name="xxx" class="yyy" method="zzz">
String namespace_action = invocation.getProxy().getNamespace();//命名空间
String actionName_action = invocation.getProxy().getActionName();//action名字xxx
String method_action = invocation.getProxy().getMethod();//method名字zzz
ActionContext context = invocation.getInvocationContext();
Map<String, Object> session = context.getSession();
HttpServletRequest request = (HttpServletRequest) invocation
.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse) invocation
.getInvocationContext().get(StrutsStatics.HTTP_RESPONSE);
}
}
下面是一个处理同一账号只能在一个地方登陆的拦截器简单实现:
package com.tch.test.ssh.interceptor;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.StrutsStatics;
import org.springframework.stereotype.Component;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.tch.test.ssh.entity.User;
import com.tch.test.ssh.info.LoginInfo;
import com.tch.test.ssh.info.UserInfo;
@Component("checkLogin")
public class CheckLoginInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("interceptor............................");
HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get(StrutsStatics.HTTP_REQUEST);
String url = request.getRequestURI();
if(url.contains("/ssh/login.action")){
//登陆
return invocation.invoke();
}
//已经登陆
HttpSession session = request.getSession();
Date current_login_time = (Date) session.getAttribute("login_time");//一个账号登陆之后会在session中保存此次登陆的时间
User user = (User) session.getAttribute("login_user");
if(user == null || user.getId() == null || current_login_time == null){
//session中没有相关信息,则重新登录
return "login";
}
LoginInfo info = (LoginInfo)UserInfo.LOGIN_USERS.get(user.getId());//账号登陆之后,会在服务器端保存该账号的登录时间,当有另外一个登陆的时候,会更新该时间,从而保证是最近的登陆时间
if(info != null && info.getLoginTime() != null){
Date latest_login_time = info.getLoginTime();
if(latest_login_time.getTime() > current_login_time.getTime()){//比较session中的登录时间和服务器保存的登录时间,确定该登陆是否是最新的登陆
ActionContext.getContext().put("errorMessage", "账号在别处登录,当前用户被强制退出 !");
session.invalidate();
System.out.println("*****************删除session*************");
return "error";
}
}
return invocation.invoke();
}
@Override
public void destroy() {
}
@Override
public void init() {
}
}
然后再struts.xml中配置该拦截器:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <!-- 定义一个自己的package,在里面定义拦截器栈,后面的package继承该package即可使用里面的拦截器 --> <package name="mypackage" extends="struts-default"> <interceptors> <interceptor name="checkLogin" class="checkLogin"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="checkLogin"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!-- 设置默认的拦截器栈为自定义的拦截器栈,这样就可以对所有的请求拦截处理了 --> <default-interceptor-ref name="myStack"/> </package> <package name="default" namespace="/" extends="mypackage"> <default-action-ref name="index" /> <global-results> <result name="error">/user/pages/loginError.jsp</result> <result name="login">/index.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error" /> </global-exception-mappings> <action name="show" class="userAction" method="select"> <result>/WEB-INF/pages/User.jsp</result> </action> <action name="goEdit" class="userAction" method="goEdit"> <result>/WEB-INF/pages/editUser.jsp</result> </action> <action name="login" class="userAction" method="login"> <result>user/pages/all.jsp</result> <result name="error">/user/pages/loginError.jsp</result> </action> <!-- 使用通配符 --> <action name="*User" class="userAction" method="{1}User"> <result type="redirectAction"> <param name="actionName">show</param> <param name="namespace">/</param> </result> </action> </package> </struts>