이 기사에서는 주로 로그인 제한 및 동일한 계정에 대한 로그인 수를 달성하기 위해 Java에서 세션 청취를 사용하는 것을 소개합니다. 특정 코드는 다음과 같습니다.
문제 도메인 :
1. 동일한 계정으로 로그인 :이 계정이 이미 로그인 된 경우 다시 로그인 할 수 없습니다 (QQ 모드와 반대).
2. 로그인 된 수가 제한되어 있으면 사람들의 수가 초과되거나 도달 한 경우 프롬프트는 다음과 같습니다. 시스템이 바쁘다. 나중에 다시 시도하십시오.
솔루션 : httpsessionattributeListener 리스너 사용 (httpsessionListener를 동시에 사용했지만 작동하기가 어렵습니다).
지식 보호 구역 : httpssessionattributeListener에는 Attributeadd, Attributermove 및 AttributeReplace의 세 가지 방법이 있습니다.
세션의 setattribute 및 RemoveTribute는 Attributeadd 및 Attributermove 메소드를 트리거합니다. 동일한 세션의 동일한 속성의 반복 설정은 AqubireTerPlace 메소드를 트리거합니다.
httpsessionlistener가 작동하기 어려운 이유 : JSP 페이지에 액세스하는 한 세션을 만들 수 있습니다 (예 : 서버 측에서 서버 측에서 HTML에 액세스 할 때 세션을 만들지 않습니다. 예를 들어 서플릿에서 호출 할 경우). JSP는 동적 페이지이며 본질적으로 서물입니다. 내 login.jsp는 분명히 JSP입니다. 리스너에서 세션을 무효화하고 로그인 페이지로 돌아 오면 즉시 다른 세션을 만들었습니다. 이것은 내가 분명하지 않은 것이며 기술에서 집에 도착하지 않았습니다.
특정 구현 :
리스너 코드
공개 클래스 onlineListener는 httpsessionlistener, httpsessionattributeListener {private static list <sessionanduser> 세션을 구현합니다. 정적 int dels = -1; 정적 부울 플래그 = 거짓; static {if (sessions == null) {sessions = collections .synchronizedList (new ArrayList <SendessAndUser> ()); }} public void sessioncreated (httpssessionEvent hse) {system.out.println (hse.getSession () + "-" + new Date ()); System.out.println (hse.getSession () + "-" + new Date ()); } public void sessionDestroyed (httpssessionEvent hse) {system.out.println ( "---------------------------------"); System.out.println (hse.getSession () + "" + new 날짜 (hse.getSession (). getLastAccessedTime ()); System.out.println (hse.getSession () + "" + new Date ()); } public void argributeadded (httpssessionBindingEvent e) {system.out.println ( "------------*시작 추가*--------------------" + sessions.size ()); httpsession session = e.getsession (); ActionContext CTX = ActionContext.getContext (); 부울 NewOne = true; 문자열 attrname = e.getName (); // if (attrname.equals (constant.user_name)) {// 로그인 번호를 확인합니다. ctx.put ( "timeoutmsg", "serverbusy"); } string nowuser = (string) e.getValue (); // 로그인했는지 여부를 확인하기 위해 모든 세션을 통과합니다. 그렇다면 로그인 한 (int i = sessions.size () -1; i> = 0; i--) {sessionAndUser tem = sessions.get (i); if (tem.getUserName (). equals (nowuser)) {newone = false; ctx.put ( "timeoutmsg", "lodloged"); // tem.getSession (). invalidate (); // // 동일한 계정으로 로그인하고 자동으로 제거 브레이크를 호출합니다. }} // 새 로그인 계정을 계정 유지 보수 목록에 추가합니다. if (newone) {sessionanduser sau = new SessionAndUser (); sau.setusername (nowuser); Sau.setSession (세션); sau.setsid (session.getid ()); sessions.add (sau); }}} public void attributermoved (httpssessionBindingEvent e)는 불법입니다. System.out .println ( "-----------*제거 시작*---------------------" + sessions.size ()); if (dels> -1) {if (flag) {sessions.remove (dels); flag = false; }} else {// 登录 String attrname = e.getName (); if (attrname.equals (constant.user_name)) {string nowuser = (String) .getValue (); // (int i = sessions.size () -1; i> = 0; i-)에 대한 모든 세션을 가로 지르십시오. {sessionanduser tem = sessions.get (i); if (tem.getusername (). Equals (nowuser)) {sessions.remove (i); 부서지다; }}}}} public void arventReerPlaced (httpssessionBindingEvent e) {httpsession session = e.getSession (); system.out .println ( "-----------*시작을 시작하십시오*-------------------------------" + sessions.size ()); 문자열 attrname = e.getName (); dels = -1; // 登录 if (attrname.equals (constant.user_name)) {// user nowuser = (user) e.getValue (); // Old Value String nowuser = (string) session.getAttribute (constant.user_name); // 当前 session 中的 user // traverse All Sessions for (int i = sessions.size) tem = sessions.get (i); if (tem.getUserName (). equals (nowuser) &&! tem.getSid (). equals (session.getId ()) {System.out.println ( "remove : invalidate 1!"); dels = i; flag = true; } else if (tem.getSid (). Equals (session.getId ()) {tem.setUserName (nowuser); }} if (dels! = -1) {sessions.get (dels) .getSession (). invalidate (); // 실패하면 제거 메소드가 자동으로 호출됩니다. 또한 세션에서 제거됩니다}}}} 코드의 주요 아이디어는 정적 목록 <SeloverAnduser>를 정의하여 세션 및 계정 이름을 저장하는 것입니다.
리스너가 값을 반환하고 로그인 작업에서 처리하는 코드
session.setattribute (constant.user_name, operator.getusername ()); ActionContext CTX = ActionContext.getContext (); if ( "serverBusy".Equals (ctx.get ( "timeoutmsg"))) {ctx.put ( "timeoutmsg", "서버가 바쁘고 나중에 다시 시도하십시오"); "점프"를 반환합니다. } if ( "beenloged".equals (ctx.get ( "timeoutmsg"))) {ctx.put ( "timeoutmsg", "이 계정은 다른 곳에 로그인됩니다"); "점프"를 반환합니다. } 페이지 캡처 프롬프트 정보 코드
<%@taglib prefix = "s"uri = " /struts-tags"%> <s : 속성 값 = "#attr.timeoutmsg" />
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!