关于SSM框架实现单设备登录的问题,即同一个账号,前一个用户登录后,后一个账号再登录,前一个用户登录失效

思路:
1.在登录的controller层中先判断用户是否登录成功,如果登录成功,每次都用session去获取sessionid,并且把它保存到application作用域中,同时还要把当前用户的登录信息也保存作用域和session里面
2.创建一个自定义拦截器SysInterceptor,使用每次请求登录都去拦截对比登录信息,如果第一次登录的用户和第二次登录的用户两个的登录信息一致并且sessionid不一致,则移除前一个用户的session,并给出提示页面,让其重新登录,否则正常的走流程登录
具体实现代码:

Controller层登录代码

if(null != user){//登录成功
			String sessionId = session.getId(); //每次登录的时候获取用户的sessionid
			request.getServletContext().setAttribute("sessionid", sessionId); //把当前用户登录的sessionid存到application作用域中
			request.getServletContext().setAttribute("Devuser", user);
		/*	System.err.println("打印sessionid身份令牌:>>>>>>>>>>>>>>>>>>>>>"+sessionId);*/
			//放入session
			session.setAttribute(Constants.DEV_USER_SESSION, user);
			//页面跳转(main.jsp)
			return "redirect:/dev/flatform/main";
		}else{
			//页面跳转(login.jsp)带出提示信息--转发
			request.setAttribute("error", "用户名或密码不正确");
			return "devlogin";
		}

自定义拦截器SysInterceptor

public class SysInterceptor extends HandlerInterceptorAdapter {
	private Logger logger = Logger.getLogger(SysInterceptor.class);
	
	public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception{
		HttpSession session = request.getSession(); //获取session
		String applicationSessionid = (String) request.getServletContext().getAttribute("sessionid"); //登录的sessionid
		DevUser applicationDevUser = (DevUser) request.getServletContext().getAttribute("Devuser");  //登录的用户
 		String sessionId = request.getSession().getId(); //获取当前登录的sessionid
		BackendUser backendUser = (BackendUser)session.getAttribute(Constants.USER_SESSION);
		DevUser devUser = (DevUser)session.getAttribute(Constants.DEV_USER_SESSION);
		//判断如果用户存在,并且sessionid不一致,让前一个session失效
	
		if((devUser!=null) && (devUser.getDevCode().equals(applicationDevUser.getDevCode())) && (!applicationSessionid.equals(sessionId))){
			session.removeAttribute(Constants.DEV_USER_SESSION); 
			response.sendRedirect(request.getContextPath()+"/401.jsp");
			return false;
		}
		if(null != devUser){
			return true;
		}else if(null != backendUser){
			return true;
		}else{
			response.sendRedirect(request.getContextPath()+"/403.jsp");
			return false;
		}
	}
}

springMVC.xml拦截器部分配置

<!-- 配置interceptors -->
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/manager/backend/**"/>
			<mvc:mapping path="/dev/flatform/**"/>
			<bean class="cn.appsys.interceptor.SysInterceptor"/>
		</mvc:interceptor>		
	</mvc:interceptors>

实现效果如下:
用户A登录:
在这里插入图片描述
用户B登录:
在这里插入图片描述
当用户A登录后,用户B再登录,用户A再刷新页面则跳到提示页面
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值