Struts2拦截器之防止多地同时登陆

实现多台电脑不能同时登陆同一个帐号(本项目 浏览器 使用的是IE)

/**
* 登陆拦截器
*/
public class SessionLoginInterceptor extends AbstractInterceptor{
     

       @Override
       public String intercept(ActionInvocation invocation) throws Exception {
     
              ActionContext context = ActionContext.getContext();
              Object action = invocation.getAction();
              HttpSession session = ServletActionContext.getRequest().getSession();
              //系统共用一个上下文的应用 ,将登陆的信息 以 userCode为key session为值的 形式存放,每次只需比较session 的值 就知晓是否是同一个浏览器
              Map<String,Object> application = context.getApplication();
              String MethodName = invocation.getProxy().getMethod();
	      //拦截登陆Action 中的登陆方法
              if(action instanceof LoginAction && MethodName.equalsIgnoreCase("userLogin")){
     
              		String result = invocation.invoke();
              		//登陆方法执行后 会将userCode 放入session 
              		String userCode = (String)session.getAttribute("userCode");
              		if(userCode != null){
     
              			HttpSession  ob = (HttpSession)application.get(userCode);
              			if(ob == null){
     
              				application.put(userCode,session);
              			}else{
     
              				if(ob.equals(session)){
     
              					//同一个session 不做任何操作
              				}else{
     
              					application.put(userCode,session);
              				}
              			}
              		}
              		return result;
              }else{
     
              //非登陆方法的拦截
              		String userCode = (String)session.getAttribute("userCode");
              		if(userCode == null){
     
              		//原有session 已失效,继续操作不退出
              		 return "loginRepeat";
              		}else{
     
              		HttpSession  ob = (HttpSession)application.get(userCode);
              		if(!ob.equals(session)){
     
              			//在另一台电脑登陆了,使session失效 并跳转到登陆重复界面
              			session.invalidate();
              			return "loginRepeat";
              		}else{
     
              			return invocation.invoke();
              		}
              		}
              }
       }
}

struts2 的浏览器的配置

//以下是strus2 的配置文件中的拦截器部分
<struts>
	<package name="struts-base" extends="struts-default" abstract ="true" namespace="/">
	<interceptors>
		<!-- 声明拦截器 -->
		<interceptor name="sessionLoginInterceptor" class="com.test.SessionLoginInterceptor"/>
  		<!-- 加入拦截器的栈中 -->
 		<interceptor-stack name="Myinterceptor">
 			<!-- 自定义的拦截器先调用就放前面了 -->
 			<interceptor-ref name="sessionLoginInterceptor"></interceptor-ref>
 			<!-- 默认的拦截栈,放在后面 -->
 			<interceptor-ref name="defaultStack"></interceptor-ref>
 		</interceptor-stack>
	</interceptors>
	
	<!-- 设置全局的拦截 -->
	<default-interceptor-ref name="Myinterceptor" />
	
	<!-- 设置全局的拦截返回 -->
	<global-results>
		<results name="loginRepeat">/page/loginRepeat.jsp</results>
        </global-results>
	</package>
</struts>




知识点:
1.invocation.invoke()
: 执行拦截的Action方法 ,拦截后操作 可以分为
在放在invocation.invoke() 前 就是在执行前操作;
在放在invocation.invoke() 后 就是在执行后操作;
若已经调用了invocation.invoke() 再return 其他值 进行跳转界面 是不会起效果的
上述再另一台登陆时return “loginRepeat”; 前 执行invocation.invoke() 将不会正常跳转到loginRepeat.jsp
2.global-results : name的默认值为success,type的默认值为dispatcher,表示请求转发到JSP页面

struts2的result标签讲解的很全

https://www.jianshu.com/p/64373586e846

你可能感兴趣的:(struts2,java,后端,struts2)