QQ 로그인 함수와 유사한 동시에 한 곳에서만 로그인 할 수있는 Javaweb의 구현 아이디어는 다음과 같습니다.
1.이 기능의 기능은 무엇입니까?
모두가 그것에 대해 생각합니다. 어쨌든, 항상 그런 요구가있을 것입니다. 요즘에는 수요가 없을 것입니다. . 헤헤. 때로는 요구 사항이 아닐 수도 있으며 안전을 위해 그렇게 할 가능성이 높습니다. 예를 들어,이를 위해서는 시험 시스템과 온라인 채팅 시스템이 필요합니다.
2. 구현 프로세스
에이. 문제 분석
시스템에서 우리는 일반적으로 로그인 정보를 세션에 바인딩합니다. 이것에서 시작하는 것은 해결책을 찾을 수있는 것 같습니다. 무뚝뚝하게 말하면, 사용자가 로그인하면 사용자가 로그인되는지 여부를 결정하십시오. 로그인하면 이전 세션을 지우는 것이 좋습니다. . 매우 간단 해 보입니다. 실제로, 신중하게 생각하면 다음과 같은 문제가 있습니다. 사용자가 이전에 로그인 한 결과, 즉 로그인 된 모든 세션 정보에 액세스하는 방법은 무엇입니까?
비. 특정 구현
우리 모두 알다시피, J2EE API에서 모든 세션 정보를 직접 얻을 수있는 구체적인 방법이없는 것 같습니다. 그러나 리스너를 구성하여 모든 세션 생성 및 파괴 프로세스를 모니터링 할뿐만 아니라 세션에서 속성의 생성, 삭제 및 교체 프로세스를 모니터링 할 수 있습니다.
실제로 다음을 수행하면됩니다.
사용자 로그인 정보를 세션에 저장할 때 해당 세션은 속성을 생성하는 속성 프로세스이며 현재 세션을 ArrayList로 기록 할 수 있습니다.
실제로 목록에 저장할 때 먼저이 목록에 사용자의 로그인 정보가 있는지 여부를 먼저 이동시켜야합니다. 존재하는 경우이 목록에있는 세션 정보를 파괴하고 목록에서 제거하십시오. 존재하지 않으면 세션 정보를 목록에 넣으십시오.
세션의 로그인 정보가 파괴되면 목록에서 세션을 직접 제거하십시오.
또한 사용자가 로그 아웃하지 않고 로그인하고 직접 로그인하면 세션 속성을 대체하는 프로세스입니다. 또한 새로운 사용자가 현재 세션 외에 다른 세션에 이미 존재하는지 여부를 결정해야합니다. 존재하면 삭제하십시오.
특정 코드는 다음과 같습니다.
패키지 com.weirhp; import java.util.arraylist; import java.util.collections; import java.util.list; import javax.servlet.http.httpsession; import javax.servlet.http.httpessessionattributeListener; import javax.servlet.httpeTevent.httpeTevent javax.servlet.http.httpsessionevent; import javax.servlet.http.httpsessionListener; public class recordessionListener 구현 httpsessionattributeListener, httpsessionListener {private static list <sessionAnduser> sessions; public strestinflag = "loginuser"; null) {sessions = Collections.synchronizedList(new ArrayList<SessionAndUser>());}}public void attributeAdded(HttpSessionBindingEvent e) {HttpSession session = e.getSession();System.out.println("-------------*start added*-----------------------");String attrName = e.getName();// if (attrname.equals (loginflag)) {user nowuser = (user). (tem.getUserId (). equals (nowuser.getName ())) {tem.getSession (). invalidate (); // 자동으로 removeBreak;}} sessionanduser sau = new SessionAndUser (); sau.setUserId (nowuser.getName ()); sau.setSession (session); sau.setSid (session.getId.getid ()); sessions.add (sau);} public void attributermoved (httpsessionBindingEvent e) {httpsession session = e.getSession (); system.out.println ( "------------*제거 시작*------------------------------------------------------------------------ e.getName = e.getName (e.getName); // 登录 if (attrname.equals (loginflag)) {user nowuser = (user) e.getValue (); // 遍历所有 sessionfor (int i = sessions.ssize ()-1; i> = 0; i-) {sessionanduser tem = sessions.get (i); if (tem.getUserid (). equals (nowuser.getName ())) {sessions.remove (i); break;}}}} public aitritributeerperated (httpsessionBindingEvent e) {httpsession session = e.getSession (); system.out.println ( "-----------*시작 시작*------------------------"); String attrname = e.getName (); int dels = -1; // 登录 if (attrname.equals (loginflag)) {// user nowuser = (user); getvalue (); (user) session.getAttribute (loginflag); // 현재 세션의 사용자는 모든 세션을 통과합니다 (int i = sessions.size () -1; i> = 0; i-) {sessionanduser tem = sessions.get (i); if (tem.getuserid (). {system.out.println ( "remove : invalidate 1!"); dels = i;} else if (tem.getSid (). equals (session.getId ()) {tem.setUserId (nowuser.getName ());}} if (dels! =-1) {sessessions (dels) 무효화 될 때 호출됩니다. 또한 세션에서 제거됩니다}}}} public void sessioncreated (httpssessionEvent e) {} public void sessionDestroyed (httpsessionEvent e) {}}Web.xml의 공식
<Leater> <display-name> Recordession </display-name> <layer-class> com.weirhp.recordsessionListener </Learger-Class> </largeer>
3. 가능한 문제
전체 프로그램이 기대하지 않은 것들이있을 수 있습니다. 몇 가지 버그가있을 수 있으며 특정 프로젝트에 사용될 때는 조심해야합니다. 모두가 사진을 만들고 제안을 할 수 있기를 바랍니다. 다시 개선하겠습니다.
4. 나중에 어떤 생각
두 머신이 동일한 계정을 사용하여 동시에 시스템에 로그인하면 두 계정을 성공적으로 로그인 할 수 있습니까? . (또한이 세션 목록이 매우 큰 경우 트래버스 기간 동안 동일한 계정을 사용하여 시스템에 로그인 할 때 두 개의 기계가 성공적으로 로그인 할 수 있습니다). 매우 얽힌. . 어떻게 제어해야합니까?
(솔루션 : 테스트 후, 청취자는 시스템의 싱글 톤입니다. 메소드에 동기화 키워드를 추가하면 목록의 스레드 안전성을 보장 할 수 있습니다.)
위의 것은 편집자가 동시에 한 장소에서만 로그인 할 수 있다는 Javaweb입니다 (QQ 로그인 기능과 유사). 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!