JavaWeb은 동일한 계정을 동일한 시간에 한 장소에서만 로그인할 수 있습니다(QQ 로그인과 같은 기능).
1. 이 기능은 어떤 작용을 하는가
다들 생각해봐.어차피 이런 수요가 있을 거야.요 몇 년 동안 어떤 수요도 없을 것이다.허허.때로는 꼭 필요한 것도 아니고, 안전을 위해서도 그럴 가능성이 높다.예를 들면 시험 시스템, 온라인 채팅 시스템, 이런 식으로 할 필요가 있죠.
2. 실현 과정
a. 문제 분석
시스템에서, 우리는 일반적으로 로그인 정보를session에 귀속시키는데, 이것으로부터 해결 방법을 찾을 수 있을 것 같다.말하자면 사용자가 로그인할 때 이 사용자가 로그인했는지 판단하고 로그인하면 이전의 세션을 지우면 OK입니다.쉬워 보이죠?사실 당신은 다음과 같은 문제를 발견할 수 있을 것이다. 어떻게 이전에 이 사용자가 로그인한 적이 있는지, 즉 모든 로그인한session 정보에 접근한 적이 있는지?
b. 구체적 실현
아시다시피 j2eeapi에서는 구체적인 방법 없이 모든 세션 정보를 직접 얻을 수 있는 것 같습니다.그러나 우리는 감청기를 조립하여 모든session의 창설과 파괴 과정을 감시하고session의 속성의 창설, 삭제와 교체 과정을 감시할 수 있다.
사실 우리는 다음과 같은 처리만 하면 된다.
사용자의 로그인 정보를 세션에 저장할 때 대응하는 것은 세션의 속성을 만드는 과정 (attributeAdded) 입니다. 현재 세션을 ArrayList에 기록할 수 있습니다.
사실list에 저장할 때 이 목록에 이 사용자의 로그인 정보가 있는지 먼저 훑어봐야 합니다.존재하면 이list에 존재하는session 정보를 없애고list에서 제거하고 존재하지 않으면 이session 정보를list에 넣습니다.
세션의 로그인 정보가 사라질 때, 이 세션을list에서 제거합니다.
그리고 사용자가 로그인한 후에 로그아웃하지 않고 로그인할 때session 속성의 교체 과정입니다.새로운 사용자가 현재session을 제외한 다른session에 존재하는지 여부를 처리해야 합니다.존재하면 삭제됩니다.
구체적인 코드는 다음과 같습니다.
package com.weirhp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class RecordSessionListener implements HttpSessionAttributeListener,
HttpSessionListener {
private static List<SessionAndUser> sessions;
public static String loginFlag = "loginUser";
static {
if (sessions == 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) e.getValue();
User sUser = (User)session.getAttribute(loginFlag);
// session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
tem.getSession().invalidate();// remove
break;
}
}
SessionAndUser sau = new SessionAndUser();
sau.setUserID(nowUser.getName());
sau.setSession(session);
sau.setSid(session.getId());
sessions.add(sau);
}
}
public void attributeRemoved(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start Removed*-----------------------");
String attrName = e.getName();
//
if (attrName.equals(loginFlag)) {
User nowUser = (User) e.getValue();
// session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())) {
sessions.remove(i);
break;
}
}
}
}
public void attributeReplaced(HttpSessionBindingEvent e) {
HttpSession session = e.getSession();
System.out.println("-------------*start replace*-----------------------");
String attrName = e.getName();
int delS=-1;
//
if (attrName.equals(loginFlag)) {
// User nowUser = (User) e.getValue();//old value
User nowUser = (User)session.getAttribute(loginFlag);// session user
// session
for (int i = sessions.size()-1; i >= 0; i--) {
SessionAndUser tem = sessions.get(i);
if (tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) {
System.out.println("Remove:invalidate 1!");
delS=i;
}else if(tem.getSid().equals(session.getId())){
tem.setUserID(nowUser.getName());
}
}
if (delS!=-1) {
sessions.get(delS).getSession().invalidate();// remove 。 sessions
}
}
}
public void sessionCreated(HttpSessionEvent e) {
}
public void sessionDestroyed(HttpSessionEvent e) {
}
}
웹에서xml의 조제
<listener>
<display-name>recordSession</display-name>
<listener-class>com.weirhp.RecordSessionListener</listener-class>
</listener>
3. 존재할 수 있는 문제전체 절차는 아마도 약간 생각하지 못했을 것이다.일부 버그가 존재할 수 있습니다. 구체적인 프로젝트는 신중해야 합니다. 벽돌을 두드리는 것을 환영하고 조언을 해 주십시오.내가 다시 개선할게.
4. 훗날의 생각
만약 두 기계가 같은 계정을 사용하여 같은 시간에 시스템에 로그인한다면, 두 계정 모두 로그인에 성공할 수 있지 않을까요?(그리고 이session List가 크면 흐르는 시간 동안 두 기계가 같은 계정을 사용하여 같은 시간에 시스템에 로그인해도 성공할 수 있다.)고민이야.어떻게 컨트롤해야 되지?
(해결 방법: 테스트를 통해 Listener는 시스템에서 하나의 예입니다. 그 방법에synchronize 키워드를 추가하면list의 라인이 안전할 수 있습니다.)
위에서 말한 것은 여러분에게 소개된 JavaWeb이 같은 계정을 같은 시간에 한 장소만 로그인할 수 있도록 실현하는 것입니다(QQ로그인과 같은 기능). 여러분에게 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주시면 제때에 답장해 드리겠습니다.여기에서도 저희 사이트에 대한 지지에 감사드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.