闲的蛋疼,本身弄了个单用户登陆,第二次登陆能够把第一次登陆的用户挤下去...java
先上login的代码:ajax
//...登陆验证成功后... //这里得到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来保存登陆用户redis
首先,先生成uuid放到cookie,session和缓存里面,方便在后面验证,spring
而后须要判断在redis中是否存在,由于作的是第二次登陆把第一次登陆挤下去,那就把保存的对象中uuid更新一下,更新到最新,若是不更新的话就变成:第一个用户登录在线后,同帐号没法登陆了.. json
接下来是过滤:缓存
//得到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重启啊宕机啊可能会形成这状况吧,加个验证).cookie
主要判断一下uuid是否一致就能够了,由于登陆时咱们把生成的最新的uuid放到缓存里了,若是不一致说明这个帐号在别的地方登陆过了,而后就能够作其余的操做了.session
最后,销毁session时:jsp
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销毁时把缓存删一下...貌似不删也行,不过会一直留在缓存里面...ide