闲的蛋疼,自己弄了个单用户登录,第二次登录可以把第一次登录的用户挤下去...
先上login的代码:
//...登录验证成功后... //这里获得uuid String uuid = super.getUUID(); //保存登录用户的数据 LoginUser login = new LoginUser(); login.setId(user.getId()); login.setAccount(user.getAccount()); login.setRealName(user.getRealName()); login.setUuid(uuid); //设置cookie CookieUtil.deleteCookie(response,request, configInfo.getAdminCookieName()); CookieUtil.addCookie(response, configInfo.getAdminCookieName(), uuid); //取得redis key String key = configInfo.getRedisSessionListKey() + login.getAccount(); //缓存中是否存在 if(redisClient.isExist(key)){ //从缓存删除 redisClient.del(key); } redisClient.setObject(key, login, 0); //登录成功 request.getSession().setAttribute(configInfo.getAdminSessionName(), login);
这里我用了redis来保存登录用户
首先,先生成uuid放到cookie,session和缓存里面,方便在后面验证,
然后需要判断在redis中是否存在,因为做的是第二次登录把第一次登录挤下去,那就把保存的对象中uuid更新一下,更新到最新,如果不更新的话就变成:第一个用户登陆在线后,同账号无法登录了..
接下来是过滤:
//获得cookie String uuid = CookieUtil.getCookieValue(httpRequest, configInfo.getAdminCookieName()); LoginUser user = (LoginUser)httpRequest.getSession().getAttribute(configInfo.getAdminSessionName()); String uri = httpRequest.getRequestURI(); String redisSessionKey = configInfo.getRedisSessionListKey() + user.getAccount(); //单用户登录验证 if(redisClient.isExist(redisSessionKey)){ LoginUser login = (LoginUser) redisClient.getObject(redisSessionKey); //这里判断redis中的用户的uuid是否和cookie里的一致 if(!login.getUuid().equals(uuid)){ //后台ajax请求 if(uri.contains("/json/")){ //直接中断 return; } //与当前id不同,说明再其他地方登录过,所以返回重新登录 httpResponse.sendRedirect("/" + configInfo.getProjectName() + "/main.jsp"); return; } }else{ //用户不在缓存,返回重新登录 httpResponse.sendRedirect("/" + configInfo.getProjectName() + "/index.jsp"); return; }
首先判断一下缓存中是否有当前用户(一般情况下有的,但是redis重启啊宕机啊可能会造成这情况吧,加个验证).
主要判断一下uuid是否一致就可以了,因为登录时我们把生成的最新的uuid放到缓存里了,如果不一致说明这个账号在别的地方登录过了,然后就可以做其他的操作了.
最后,销毁session时:
public class AppSessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent event) { System.out.println("Session创建"); } @Override public void sessionDestroyed(HttpSessionEvent event) { System.out.println("Session销毁"); //获得spring中的bean ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(event.getSession().getServletContext()); RedisClient redis = ctx.getBean(RedisClient.class); ConfigInfo configInfo = ctx.getBean(ConfigInfo.class); HttpSession session = event.getSession(); //获得要销毁的用户 LoginUser user = (LoginUser)session.getAttribute(configInfo.getAdminSessionName()); if(user != null ){ String key = configInfo.getRedisSessionListKey() + user.getAccount(); if(redis.isExist(key)){ redis.del(key); System.out.println("删除缓存..."); } } } }
在session销毁时把缓存删一下...貌似不删也行,不过会一直留在缓存里面...
时间: 2024-10-08 11:46:41