단일 사용자 로그인 정보

3146 단어
심심해서 혼자 로그인을 했는데 두 번째 로그인은 첫 번째 로그인을 밀어낼 수 있어요...
먼저 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);

여기 제가 레드리스로 로그인 사용자를 저장했어요.
우선, 성uid는 쿠키,session, 캐시에 넣고 뒤에서 검증하기 편리하고,
그리고 Redis에 존재하는지 판단해야 합니다. 두 번째 로그인을 해서 첫 번째 로그인을 밀어내면 저장된 대상 중 uid를 업데이트하고 최신으로 업데이트합니다. 업데이트하지 않으면 첫 번째 사용자가 로그인한 후 같은 계정에 로그인할 수 없습니다... 
다음은 필터링입니다.
//  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가 다시 시작하거나 다운되면 이 상황을 초래할 수 있습니다. 검증을 추가합니다.)
주로 uid가 일치하는지 판단하면 됩니다. 로그인할 때 우리는 생성된 최신 uid를 캐시에 넣었기 때문에 일치하지 않으면 이 계정이 다른 곳에서 로그인했다는 것을 설명하고 다른 조작을 할 수 있습니다.
마지막으로 세션을 제거할 때 다음을 수행합니다.
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("    ...");
			}
		}
		
	}
}

세션 제거할 때 캐시 지우기...지우지 않아도 될 것 같은데 캐시에 계속 남을 것 같아서...

좋은 웹페이지 즐겨찾기