2012-02-24 3 views
3

jsp 및 servlet에 하나의 Java 웹 응용 프로그램이 있고 Oracle 10g EE로 db가 있습니다. 로그인 한 사용자가 로그인 한 경우 로그 아웃하지 않는 한 어떻게 동일한 사용자가 다시 로그인하지 못하게 할 수 있습니까?Java에 의해 oracle에 로그인 된 사용자 잠금

참고 : 내가 로그인 한 사용자 A가 다음 로그인 페이지를 클릭 할 경우 즉시 그가 자신의 홈 페이지로 전달 될 것이라고 이야기하지을입니다.

내가 이미 로그인 한 사용자가 다시 로그인하는 것을 방지 할 수있는 방법은 무엇입니까? 사용자 A가 이미 db에 로그인되어 있다고 가정하고 (로그 아웃하지 않음) 사용자 B가 로그인을 시도합니다. 사용자 A의 사용자 ID와 암호로 db에 연결하면 간단히 사용자 B가 로그인 할 수 없게됩니다. 어떻게 구현합니까? 어떤 세션이있는 경우 예 로그인을 다른 거부 허용하는 경우

답변

2

당신은 로그인 한 사용자의지도를 관리하는 데 필요한, Map<String, String> userToSessionIdMap 당신의 사용자가 로그인 지금에 제거 할 필요가 로그 아웃이 사용자 이름 존재

을 검사 할 때 지도에서 해당 항목은 또한 당신은 세션이 다시

가 참조 항목을 제거 만료되면 그렇게 HttpSessionBindingListener를 구현해야

+0

확인하지만, 사용자가 로그 아웃을 클릭하지 않은 경우, 단순히 그가 그 세션에서 로그 아웃 할 수있는 방법을 다음 브라우저를 종료하십시오 user_a 시도가 두 번에 로그인 할 경우받을 수 있습니까? – Tom

+1

그것이'HttpSessionBindingListener'가 작동하는 곳입니다. –

+0

괜찮습니까? 역시 DB에 로그인 한 사용자의지도를 관리해야합니까? 나는 그지도 userToSessionIdMap – Tom

2

데이터베이스가 자신의 직업하자!

(이 솔루션은 DBA가에서 도움을받을 수 있다고 가정 또는 당신은 데이터베이스에 SYSDBA 액세스 할 수 있습니다.)

첫 번째는 1 세션 사용자 당 수있는 프로파일 작성 : 다음

CREATE PROFILE single_session_profile 
     LIMIT SESSIONS_PER_USER 1; 

을 올바른 프로필을 가진 사용자를 만들거나 프로필을 사용하는 기존 사용자를 변경 :

CREATE USER user_a 
     IDENTIFIED BY user_id 
     DEFAULT TABLESPACE users 
     TEMPORARY TABLESPACE temp 
     QUOTA UNLIMITED ON users 
     PROFILE single_session_profile; 

또는

ALTER USER user_a 
     PROFILE single_session_profile; 

마지막으로, 데이터베이스가 될 이러한 제한을 준수해야합니다 :

ALTER SYSTEM SET RESOURCE_LIMIT = TRUE SCOPE = MEMORY; 

(SCOPE = MEMORY 현재 실행중인 데이터베이스 인스턴스에 대해 제한 집행을 할 수 있습니다를, 데이터베이스를 다시 시작한 후 계속 사용하도록 설정하려면 SCOPE = BOTH을 사용해야합니다. 여기에서 BOTHMEMORYSPFILE을 모두 의미하는 DB 초기 화 파일을 의미합니다. 데이터베이스가 새 SPFILE 형식, 그러나 이전 PFILE (init.ora)를 사용하지 않는 경우에, 당신은 init.oraRESOURCE_LIMIT 설정을 추가하고 데이터베이스를 다시 시작해야합니다.) 그것은

있다고.

ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit 
+0

옙 좋은 해결책, 위의 코드를 작성하면 dba 관리자에게 영향을 미칩니 까? – Tom

관련 문제