현재 웹 프로젝트에서는 이번에 동일한 계정 정보를 다른 로그인 포털에 로그인 할 수 있으므로 너무 아름답 지 않을 것입니다.
권장 독서 :
Java 다중 사용자 로그인 제한 구현
이제 두 가지 해결책이 있습니다.
1. 플래그에 필드로 사용자의 로그인 정보를 저장하십시오. 로그인이 성공할 때마다 1으로 표시되고 로그인은 0으로 표시됩니다. 1으로 표시되면 로그인 할 수 없습니다.
2. 응용 프로그램의 내장 범위에 사용자의 로그인 정보를 저장 한 다음 세션 리스너를 사용하여 각 로그인 한 사용자의 로그인 상태를 모니터링하십시오.
분명히 첫 번째 방법은 로그인 할 때마다 데이터베이스를 작동해야하므로 불필요한 성능 오버 헤드가 추가됩니다. 또한 로그인 상태에서 컴퓨터가 갑자기 종료되면 로그인 할 수 없으며 유용성이 상대적으로 낮습니다.
그러나 두 번째 방법은 다릅니다. 모든 온라인 사용자의 정보를 유지하는 것이 고도로 운영 가능하고 편리합니다.
다음으로, 우리는 주로 두 번째 방법의 특정 구현을 소개합니다.
1. 로그인을 처리하기위한 로그인 메소드에서 먼저 데이터베이스를 쿼리하여 사용자가 존재하는지 확인하십시오. 있는 경우 로그인 계정이 잠겨 있는지 확인하십시오. 그런 다음 응용 프로그램 내장 스코프 객체에서 모든 로그인 정보를 가져와 사용자 이름 계정이 로그인되었는지 확인하십시오. 로그인하면 친숙한 프롬프트가됩니다. 그렇지 않으면 응용 프로그램의 로그인 및 로그인 정보를 키 값 쌍의 형태로 저장할 수 있음을 의미합니다.
코드는 다음과 같습니다.
// 구성이없는 각 액세스 방법에 액세스가 추가되어야합니다. 그렇지 않으면 404 @Action (value = "login", results = {@Result (이름 = "index", location = "index.jsp"),}) public String login () 예외 {user result = userervice.login (user.getFuuserName (), user.getFupassord (getFupassord). if (result! = null) {if (result.getFustatus ()! = null && result.getFustatus () == 0) {super.setRequestattr (constant.message, "미안,이 사용자가 잠겨 있습니다!"); "오류"를 반환합니다. } map <string, string> loginusermap = (map <string, string>) super.getApplicationAttr (constant.login_user_map); 부울 isexist = false; String sessionId = super.getSessionId (false); if (loginusermap == null) {loginusermap = new Hashmap <string, String> (); } for (string username : loginusermap.keyset ()) {// 로그인 한 사용자의 정보가 저장되었는지 또는 동일한 사용자가 반복적으로 로그인했는지 여부를 판단하면 로그인이 허용됩니다 (! username.equals ()) || loginusermap.containsvalue (sessionid)) {계속; } isexist = true; 부서지다; } if (isexist) {super.setRequestattr (constant.message, "죄송합니다. 사용자가 로그인되었습니다!"); "오류"를 반환합니다. } else {loginUserMap.put (result.getFuuserName (), sessionId); } // 성공적으로 로그인 Super.setSessionattr (constant.login_user, result); super.setApplicationAttr (constant.login_user_map, loginusermap); logger.info (result.getFuuserName () + "성공적으로 로그인!"); // Fromurl이 세션에 값이있는 경우, 페이지 문자열로 점프하면서 horl = (string) super.getSessionattr (constant.from_url); if (fromurl! = null) {super.setSessionattr (constant.from_url, null); super.getResponse (). sendReDirect (fromurl.toString ()); 널 리턴; } return "index"; }} catch (예외 e) {e.printstacktrace (); logger.info ( "로그인 실패 :"+e.getMessage ()); } super.setRequestattr ( "메시지", "error"); "오류"를 반환합니다. }2. 로그인 포털이 처리 된 후 세션이 끝나는 경우 해당 로그인 사용자도 로그인에서 로그 아웃해야합니다. 세션 리스너를 쓸 수 있습니다. 세션이 파괴되면 로그인 한 사용자를 로그 아웃했습니다. 즉, 응용 프로그램에서 제거했습니다. 이는 사용자가 오프라인 상태임을 의미합니다.
코드는 다음과 같습니다.
패키지 com.facelook.util; java.util.map import; import javax.servlet.http.httpsessionevent; import javax.servlet.http.httpsessionListener; import org.apache.log4j.logger; import com.facelook.entity.user; public class sessionlistener는 httpsessionListener {private logger = logger.getLogger (this.getClass ()); @override public void sessioncreated (httpsessionevent event) {} @override public void sessiondestroyed (httpsessionevent event) {// session us user = (user) event.getSession (). getAttribution ( "loginUser"); if (user! = null) {map <string, string> loginusermap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ( "loginUsermap"); loginusermap.remove (user.getfuusername ()); event.getSession (). getServletContext (). setAttribute ( "loginusermap", loginusermap); }}}web.xml의 구성은 다음과 같습니다.
<!-세션 리스너-> <Leater> <Leater-Class> com.facelook.util.sessionListener </Leater-Class> </laiseer>
3. 또한 또 다른 문제가 있습니다. 로그 아웃 버튼을 클릭하지 않고 로그인 한 사용자가 갑자기 브라우저 나 페이지를 닫습니다. 그런 다음 브라우저가 새로 고침되거나 닫히면 이전 이벤트를 사용하여 발사 할 수 있습니다.
// events $ (wind
그러나 컴퓨터가 갑자기 종료, 자동 재시작 등과 같은 몇 가지 객관적인 이유를 피할 수 없으므로 다시 로그인하기 전에 서버 측 세션 세션이 재설정 될 때까지 기다릴 수 있습니다.
모든 온라인 직원을 계산하는 모듈이 아니라면 관리자는 온라인 직원의 로그인 및 로그 아웃 상태를 관리하고 문제가있는 로그인 한 사용자를 직접 파괴합니다.
다음으로 온라인 직원 모듈의 관리를 간단히 소개하겠습니다.
1. 첫째, 모든 답장 생성 상황을 모니터링하려면 세션 리스너가 필요합니다. 이 시점에서 세션이 생성 될 때마다 카운트+1을 계산 한 다음 Count-1이 파괴됩니다. 또한 웹 애플리케이션의 수명주기를 모니터링하고 ServletContext 객체를 얻은 다음 온라인 직원의 총 수를 세고 저장하려면 ServletContext 리스너가 필요합니다.
특정 코드는 다음과 같습니다.
패키지 com.facelook.util; java.util.map import; import javax.servlet.servletcontext; javax.servlet.servletcontextevent import; Javax.Servlet.ServletContextListener import; import javax.servlet.http.httpsessionevent; import javax.servlet.http.httpsessionListener; import javax.servlet.http.httpsessionListener; import org.apache.log4j.logger; import com.facelook.entity.user; Public Class SessionListener는 httpsessionListener, ServletContextListener {private int count; Private ServletContext ServletContext = NULL; public sessionListener () {count = 0; } private logger logger = logger.getLogger (this.getClass ()); @override public void sessioncreated (httpssessionevent event) {count ++; setContext (이벤트); logger.info ( "************ HTTP 세션이 만들어졌습니다 ... *******************"); } @override public void sessiondestroyed (httpsessionevent event) {// 세션이 파괴 될 때 저장된 키 값 쌍을 지우십시오. if (user! = null) {map <string, string> loginusermap = (map <string, string>) event.getSession (). getServletContext (). getAttribute ( "loginUsermap"); loginusermap.remove (user.getfuusername ()); event.getSession (). getServletContext (). setAttribute ( "loginusermap", loginusermap); } 세다--; setContext (이벤트); logger.info ( "************ http 세션이 파괴되었습니다 ... *****************************; } public void setContext (httpssessionEvent httpsessionEvent) {httpsessioneVent.getSession (). } @override public void contextDestroyed (servletcontexTevent servletcontextevent) {this.servletcontext = null; logger.info ( "************ 서보 컨텍스트가 파괴되었습니다 ... *********************"); } @override public void contextinitialized (servletcontextevent servletcontextevent) {this.servletcontext = servletcontextevent.getServletContext (); logger.info ( "************ 서비스 컨텍스트가 초기화되었습니다 ... ******************"); }}2. 사용자 Action에서 온라인 사용자를 관리하고 강제 종료 기능을 지원하는 모듈을 만듭니다.
/ ** * logout * @return * @throws servletexception * @throws ioexception */ public string logout () servletexception, ioexception {try {map <string, string> loginusermap = (map <string, string>) super.getApplicationttr (constant.login_user_map); 사용자 user = (사용자) super.getSessionAttr (constant.login_user); super.removeattribute (constant.login_user_map); loginusermap.remove (user.getfuusername ()); super.setApplicationAttr (constant.login_user_map, loginusermap); logger.info ( "로그인 로그인 성공!"); } catch (예외 e) {e.printstacktrace (); logger.error ( "로그인 실패 :"+e.getMessage ()); } 리턴 입력; } / *** 온라인 사용자 관리* @return* / public String loginManager () {반환 성공; } / *** 다른 사용자의 힘 종료* @return* / public string logoutother () {try {string username = servletactionContext.getRequest (). getParameter ( "username"); map <string, string> loginusermap = (map <string, string>) super.getApplicationAttr (constant.login_user_map); if (username! = null && loginusermap.containskey (username)) {loginusermap.remove (username); super.setApplicationAttr (constant.login_user_map, loginusermap); }} catch (예외 e) {e.printstacktrace (); logger.info ( "강제 종료 실패 :"+e.getMessage ()); } return null; }3. 관리 페이지에 온라인 사용자 목록을로드하십시오.
해당 메소드가 정의 된 후 다음과 같이 해당 관리 페이지에 온라인 목록을 추가하십시오.
<%@page import = "java.util.map"%> <%@page import = "java.util.map.entry"%> <%@page language = "java"pageencoding = "utf-8"%> <%@포함 파일 = "/common/taglib.jsp"%> <! doctype html public "-// W3c // dd xhtml 전환 // en ""http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd "> <html xmlns ="http://www.w.w3.org/1999/xhtml "> <meta http-equiv ="Contlectepequiv = "contlace-equiv ="contlace-equiv = "http://www.w.w.w.w.w.w.w.w.w.w.w.w.w3.org/1999/xhtml" " content = "text/html; charset = utf-8"/> <title> faceLook에 오신 것을 환영합니다 </title> < %@ 포함 파일 = "/common/resource.jsp" %> <script type = "text/javaScript"> <!-// events $ (window) .Bind ( 'preverununload', function () {$ .Ajax URL : "$ {ctx}/system/user! function logout (username) {if (username == "$ {sessionscope.loginuser.fuusername}") {alert ( "계정의 로그 아웃!"); 반품; } $ .ajax ({url : "$ {ctx}/system/user/user! $ ( "#count"). html (count-1); } //-> </script> </script> <body> <%@ 포함 파일 = "/common/header.jsp"%> <div id = "main"> <%@ include file = "/common/lefter.jsp"%> <div> <div> <h2> 로그인 목록 </h2> <%map <string, string> map = (map <string>) Application.getIttrate ( "); out.println ( "현재 <font id = 'count'>"+map.size ()+"</font> users online !!"); %> <table> <%for (entry <string, string> m : map.entryset ()) {%> <tr id = "tr <%= m.getkey ()%>"> <td> <%= m.getkey ()%> </td> <td> <a href = "javaScript : logout ( '<%= m.getkey ()%>')"> <%}%> </table> </div> </div> </div> </div> <%@ include = "/common/f 것을 포함자, 배포 프로젝트를 시작한 다음 서비스를 시작한 다음 온라인 사용자 관리 모듈을 입력하십시오. 간단한 효과는 다음과 같습니다.
현재 로그인 사용자는 로그인 정보에서 로그 아웃 할 수 없습니다.
이러한 방식으로 여러 사용자가 로그인하는 것을 방지하는 경우 기본적으로 실현 될 수 있습니다!
위는 여러 사용자가 반복적으로 로그인하는 것을 방지하기 위해 Java 웹 개발을위한 완벽한 솔루션입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!