단일 사인온의 기능은 실제 응용 프로그램 시나리오에서 여전히 매우 중요합니다. 논리적으로, 우리는 사용자가 동시에 두 개의 작업을 수행 할 수 없습니다. SpringMVC의 단일 사인온 구현에 대해 알아 보겠습니다.
SpringMVC의 인터셉터는 Spring의 인터셉터와 다릅니다. SpringMVC에는 통일 된 입력 Dispatcherservlet이 있습니다. 모든 요청은 DispatcherServlet을 통해 전달되므로 Dispatcherservlet에 대한 소란 만 만들면됩니다. Dispatcherservlet에는 프록시가 없으며 SpringMVC가 관리하는 컨트롤러에는 프록시가 없습니다.
1. 첫 번째 기본 구현 원리를 탐색하십시오.이 기능은 비교적 간단합니다. 즉, 한 명의 사용자 만 동시에 동일한 웹 프로젝트에서 동시에 작동 할 수 있으므로 여기에는 원격 로그인이 발견되며 두 가지 경로가 여기에 소개됩니다. 1. 서버는 로그인 한 사용자가 다른 IP를 통해 로그인 작업을 다시 수행했음을 발견 한 다음, 첫 번째 사용자에게 원격 로그인을 로그인하도록 알리는 알림을 적극적으로 푸시합니다. 2. 사용자가 작업을 수행하면 자신의 계정이 압박되었고 원격 로그인이 있음을 알게됩니다. 이 두 솔루션과 관련하여 첫 번째 솔루션은 실시간이지만 여전히 탐색되고 있습니다. 아래 두 번째 방법에 중점을 두겠습니다.
2. 두 번째 유형을 구현하는 것은 비교적 간단합니다. 두 가지 작업이 있습니다. 하나는 각 요청 요청이 고유 한 비 반복 SessionID에 해당하기 때문에 로그인 사용자의 SessionID를 저장하기 위해 사용자의 SessionID에 추가 필드를 추가하는 것입니다. 그런 다음 인터셉터 기술을 사용하여 사용자의 작업을 가로 채 웁니다. 인터셉터에서 로그인 페이지의 관련 URL 요청이 처음 릴리스되고 다른 하나는 로그인 확인 요청이 해제됩니다. 마지막으로 사용자를 필터링하십시오. (사용자 로그인에 대해, 확인이 성공할 때, 사용자가 로그인 인터 셉션 확인을 위해 세션에 저장해야 할뿐만 아니라, 세션 ID는 사용자 테이블의 해당 SessionID에 저장되어야합니다.) 이번에 요청 요청에 대해서는 세션과 ID를 얻은 다음이 ID에 따라 데이터베이스의 세션 ID와 동일한 지 여부를 비교할 수 있습니다. 차이가있는 경우 사용자 연결 서버 작업에 세션이 있기 때문에 오프라인 점프 로그인이 로그인에 점프하라는 메시지가 표시됩니다. 세션이 만료되는 한 각 사용자가 시작한 작업의 세션 ID는 동일하므로 로그인 할 때 데이터베이스에 저장된 ID와 일치합니다. 다른 장치를 사용하면 동일한 계정을 사용하여 입력하십시오. 로그인 할 때 세션이 다시 설립됩니다. 데이터베이스의 세션은 데이터베이스에서 SessionID를 새로 고치지 만 SessionID는 여전히 변경되지 않습니다. 그러나 데이터베이스의 세션이 변경되었습니다. 따라서 데이터베이스의 SessionID가 인터셉터에서 일관된 지 여부를 확인할 때 단일 사용자 로그인의 기능을 달성하기 위해 사용자의 작동을 가로 채지 못합니다. (세션에 대한 메모, 사용자가 서버에 처음 연결하면 서버 측에서 세션이 생성되고 사용자가 시작한 모든 작업 이이 세션의 ID를 전달하고 일부 상황이 발생합니다. 사용자는 오랫동안 서버와 함께 작동하지 않았습니다. 사용자는 세션을 무적하게 만듭니다. 사용자는 브라우저를 닫거나 서버를 다시 시작합니다).
다음은 SpringMVC에서의 인터셉터 구현입니다.
공개 클래스 SingleUserinterceptor는 핸들러 인터셉터를 구현합니다 {@autowiredPrivate usermapper Mapper; public void aftcompletion (httpservletrequest arg0, httpservletreponse arg1, 객체 Arg2, 예외 Arg3)은 예외 {// to auto-generated method stub} public void posth0 (httpervletrequest arg arg0, httpservletresponse arg1, object arg2, modelandview arg3)는 예외를 던졌습니다 {// todo auto-auto-renated method stub} public boolean prehandle (httpservletrequest arg0, httpservletresponse arg1, 객체 arg2) 예외 {string url = argequesturi (); // release is isgetrequesturi (); // if (url.indexof ( "login.jsp")> = 0 || url.indexof ( "new/login")> = 0 || url.indexof ( "checkuser")> = 0) {return true;} // 사용자 이름이 존재하는 경우 (즉, 로그인 및 릴리스 정수). arg0.getSession (). getAttribute ( "user"); if (user! = null) {String sessionId = mapper.getUserentity (integer.valueof (user)). else {Arg1.setStatus (arg1.sc_gateway_timeout); arg1.setContentType ( "text/html; charset = utf-8"); printwriter out = arl = arg1.getwriter (); out.println ( "<html>"); out.println ( "<script>"); 다른 곳에서, 당신은 오프라인 ') "); out.println ("wind arg0.getRequestDispatcher ( "login.jsp"). Forward (arg0, arg1); return false;}} arg0.getRequestDispatcher ( "login.jsp"). forward (arg0, arg1); return false;}}위의 코드는 동일한 사용자가 여러 번 로그인 할 때 첫 번째 로그인 사용자의 기능이 라인에서 압착되는 것을 인식 할 수 있습니다. 계정을 원격으로 로그인 한 다음 로그인 페이지로 점프하는 기능을 실현할 수 있습니다. 여기서는이 간단한 경고 프롬프트 기능의 핵심 사항을 설명해야합니다. 이 경고가 나타나면 요청을 종료 할 수 있어야합니다. 그런 다음 응답 인쇄 함수는 Alert Promption 문을 출력하여 주석화 된 점프 명령문이 존재할 수 없습니다. 있으면 조작이 올바르게 끝나지 않고 다른 작업으로 전달되거나 리디렉션되므로 경고 프롬프트 명령문은 발행되지 않습니다. 그것이 정확하든 아니든, 다른 작업에서 페이지로 출력되므로 응답 문이 나타나지 않습니다. 따라서 올바른 방법은 : 인터셉트 요청이 릴리스되지 않으며 (returnFalse) 요청은 여전히 원래 요청이며 점프하지 않습니다. 페이지로 돌아가는 응답의 인쇄 정보를 표시 할 수 있습니다. 로그인 페이지로 점프하는 것은 다음을 사용할 수 있습니다. out.println ( "window.open ( '"+arg0.getContextPath ()+"/new/login', '_ top');"); 응답에 의해 JS 출력 섹션에서 작업 요청이 실행되도록 구현하려면 로그인 페이지를 가리 킵니다.
위의 코드는 기본적으로 단일 사용자 로그인 기능으로 간주되었지만 AJAX 요청의 작동이 원격 위치에 로그인 할 때 로그인 페이지를 가리키지 않으며 즉각적인 정보가 없습니다. AJAX가 비동기 요청을하고 요청 된 URL도 프로세서 Mapper에 일치하기 때문에 먼저 이유를 설명하겠습니다. 요청이 성공적으로 고려됩니다 (반환 상태 코드는 200). 위의 응답에 인쇄 된 JS 문은 성공의 성공적인 요청과 반환 값이됩니다. 위의 문장을 언급 할 수 있습니다 : arg1.setstatus (arg1.sc_gateway_timeout); 현재 다른 작업을 수행해야합니다. 첫 번째는 문장 Arg1.setstatus (arg1.sc_gateway_timeout); 그 기능은 응답으로 반환 된 상태 코드를 설정하는 것입니다. 위의 설정은 상태 코드 504가 요청 오류를 나타 내기 위해 반환 될 것임을 나타냅니다. 현재 AJAX 요청은 더 이상 성공 방법에 응답하지 않지만 AJAX 오류 메소드에 응답합니다. 따라서 AJAX 오류에서 해당 메소드 만 실행하면됩니다.
$ .ajax ({url : 'new/msd2', success : function (a) {alert (a);}, error : function (rs) {if (rs.status == 504) {document.write (rs.responsetext);}}});원격 로그인으로 인해 AJAX 요청이 가로 채면 arg1.setstatus (arg1.sc_gateway_timeout)를 설정하십시오. 요청의 반환 상태는 504로 변경 될 수 있습니다. 그러면 오류 메소드가 응답합니다. 상태가 설정 한 상태 코드가 결정되면 document.write (rs.responsetext); ResponseText는 인터셉터의 프론트 데스크에 인쇄 된 JS 문입니다. 이 명령문이 실행 되려면 document.write (); 메소드는 DOM에 코드를 작성하여 적용되도록 코드를 작성해야합니다. 이 시점에서 비동기 AJAX 요청에 대한 모든 요청 및 단일 로그인이 기본적으로 구현되었습니다.
이 기사는 키 코드, 아이디어 및 운영 원칙을 기록하기 위해만 남겨 둡니다.
요약
위의 내용은 SpringMVC 인터셉터에서 단일 사인온 구현에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다.