자바 웹 의 제한 사용자 여러 곳 로그 인 인 인 스 턴 스 코드
전역 맵 으로 로그 인 할 때 sessionId 를 저장 합 니 다.Map 의 key 는 로그 인 이름 이 고 value 는 sessionID 입 니 다.나중에 앞 에 있 는 것 을 밀 어 냈 기 때문에 판단 하지 않 고 Map 의 값 을 덮어 쓰 면 됩 니 다.
HttpSession Listener 를 실현 하고 session 이 만 료 되 었 을 때 맵 에 해당 하 는 값 을 지 웁 니 다.
요청 을 차단 하 는 데 사용 되 는 Filter 를 구현 합 니 다.현재 sessionId 가 Map 에 있 는 지 여 부 를 판단 하고 종료 작업 을 수행 하지 않 으 면 종료 합 니 다.
로그 인 한 사용자 SessionID 를 저장 하 는 클래스
public class LoginUserMap {
private static Map<String, String> loginUsers = new ConcurrentHashMap<String, String>();
/**
* sessionId map
* @param key
* @param value
*/
public static void setLoginUsers(String loginId, String sessionId) {
loginUsers.put(loginId, sessionId);
}
/**
* loginUsers
* @return
*/
public static Map<String, String> getLoginUsers() {
return loginUsers;
}
/**
* sessionId map
* @param sessionId
*/
public static void removeUser(String sessionId) {
for (Map.Entry<String, String> entry : loginUsers.entrySet()) {
if (sessionId.equals(entry.getValue())) {
loginUsers.remove(entry.getKey());
break;
}
}
}
/**
* loginusers
* @param loginId
* @param sessionId
* @return
*/
public static boolean isInLoginUsers(String loginId, String sessionId) {
return (loginUsers.containsKey(loginId) && sessionId.equals(loginUsers.get(loginId)));
}
}
로그 인 방법 에 session ID 저장여기 서 저 는 구체 적 인 실현 을 제시 하지 않 겠 습 니 다.서로 다른 프로젝트 가 다 르 기 때문에 저 는 대략적인 절 차 를 써 서 이 해 를 돕 겠 습 니 다.
//
public void login(ttpServletRequest request) {
try {
......//
HttpSession session = request.getSession();
LoginUserMap.setLoginUsers(username, session.getId());// sessionId map
} catch (LoginException ex) {
throw ex;
}
}
HttpSessionListener 구현
public class SessionListener implements HttpSessionListener {
private Log log = LogFactory.getLog(SessionListener.class);
/**
* session
* @param event
*/
@Override
public void sessionCreated(HttpSessionEvent event) {
}
/**
* session
* @param event
*/
@Override
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
String sessionId = session.getId();
// loginUsers session
LoginUserMap.removeUser(sessionId);
log.info(sessionId + " !");
}
}
xml 설정 은 다음 과 같 습 니 다:
<listener>
<listener-class>io.github.brightloong.loginlimite.SessionListener</listener-class>
</listener>
필터 구현
public class LoginLimitFilter implements Filter{
private Log log = LogFactory.getLog(LoginLimitFilter.class);
/**
*
*/
@Override
public void destroy() {
}
/**
*
* @param request
* @param response
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession session = servletRequest.getSession();
//
String path = servletRequest.getContextPath();
String basePath = servletRequest.getScheme()+"://"+servletRequest.getServerName()+":"+servletRequest.getServerPort()+path;
try {
// , , ,
IUser user = UserUtils.getCurrUserInfo();
String loginId = user.getLoginId();
// sessionId loginUsers , if
if(!LoginUserMap.isInLoginUsers(loginId, session.getId())) {
// logout
logout();// logout
// ,
servletResponse.sendRedirect(basePath + "?logoutway=edge");
}
} catch (Exception e) {
log.debug(" , !", e);
} finally {
filterChain.doFilter(request, response);
}
}
/**
*
* @param arg0
* @throws ServletException
*/
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
xml 설정 은 다음 과 같 습 니 다:
<filter>
<filter-name>LoginLimitFilter</filter-name>
<filter-class>io.github.brightloong.loginlimite.LoginLimitFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginLimitFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
알림 정보 보이 기사용자 가 클릭 할 때 filter 를 터치 하여 모니터링 합 니 다.로그 인 한 것 을 감지 하면 로그 인 페이지 로 이동 합 니 다.이 럴 때 밀 린 것 인지 아 닌 지 를 판단 하려 면 layer 알림 상 자 를 사 용 했 습 니 다.
window.onload = function(){
if(window.parent != window){
window.parent.location.href=window.location.href;
} else {
if(GetQueryString('logoutway')) {
//alert(' , ');
layer.alert(' , , ', {
skin: 'layui-layer-lan', //
title: ' '
,closeBtn: 0
}, function(){
var url = window.location.href;
window.location.href = url.substr(0,url.indexOf('?logoutway=edge'));
});
}
}
}
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.