struts2自定义Interceptor基本使用

来源:互联网 发布:ppt美化大师 for mac 编辑:程序博客网 时间:2024/05/21 23:25
public class MyInterceptor extends com.opensymphony.xwork2.interceptor.Interceptor{@Overridepublic 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名字xxxString method_action = invocation.getProxy().getMethod();//method名字zzzActionContext 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;@Overridepublic 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();}@Overridepublic void destroy() {}@Overridepublic 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>