2010-05-17 5 views
3

비 활동으로 인해 세션이 만료되면 사용자를 Timeout.aspx로 자동 리디렉션하는 방법을 만들고 싶습니다. 내 응용 프로그램은 양식 인증을 사용하며 사용자 상호 작용을 위해 동일한 aspx 페이지 내의 업데이트 패널에 크게 의존하므로 페이지 수준 타이머가 만료 된 후 리디렉션하는 것을 원하지 않습니다. 같은 이유에서 '< meta http-equiv = "새로 고침"/ >'ASP.Net에서 클라이언트 측 세션 시간 초과 리디렉션

내가 할 수있는 일은 IsSessionTimedOut()이라는 메서드를 사용하여 간단한 ajax 웹 서비스를 만드는 것입니다. 부울 자바 스크립트 타이머를 사용하여 주기적으로 메서드를 호출하고 true를 반환하면 Timeout.aspx로 리디렉션합니다. 그러나이 메서드를 호출하여 세션 시간 초과 타이머를 다시 설정하거나 서비스 호출로 인해 세션이 절대로 시간 초과되지 않게하려는 경우 이 catch-22를 피할 수있는 깨끗한 방법이 있습니까? 다행히도 지금까지 쉽게 벗어난 쉬운 해결책이 있습니다.

+0

을 ;-) 포기해서는 안된다. 그것을 "건축물의 유물"이라고 부르십시오 ... – StingyJack

+0

@all -이 문제를 해결할 수있는 깨끗하고 정확한 방법이 있습니다. 다른 각도에서 봐야 해. –

답변

9

문제의 핵심은 AJAX 응용 프로그램에서, 당신이 연하여 클라이언트 스크립트를 혼란 있어야 강력한 사용자 경험을 제공 할 것입니다 모든 호출의 상태를 확인하고 실패가 부실 세션/티켓으로 인한 것인지 확인하는 코드 능동적 인 접근 방식을 사용하면 클라이언트 스크립트를 크게 단순화하는 동시에 훨씬 나은 사용자 경험을 제공 할 수 있습니다.

이 문제에 대한 해결책을 구체적으로 작성했습니다.

대화 형 세션을 허용하고 티켓이나 티켓을 부팅하지 않고 티켓 수명 감사 을 형성합니다.

여러 브라우저/탭은 문제가되지 않습니다.

선 스크린을 잊어 버리십시오; 주의 사항 : Ajax를 수행 할 때, 사전에 수 - 당신은 세션을 포기해야하는 세션은 이런 일에 대한 청소하거나 올바른 방법이 아니다

AsynchronousSessionAuditor 1.0

+0

이것은 매우 유망 해 보입니다. 믹스에 HttpModule을 도입 할 생각은 전혀하지 않았습니다. 감사! –

+0

@ 수은 - 너는 대단히 환영합니다. 나는 이것이 유용 할 수있어서 다행이다. –

+0

@SkySanders StateServer에도 asp.net 세션 상태로 구성된 콜백 및 포스트 백 시나리오에서 프로젝트를 사용할 수 있습니까? 그렇다면, 나는 토론하고 싶습니다. 감사합니다. – Myra

0

서버 측 세션이 만료 될 때 시간 초과가 발생하는 것이 정말로 중요합니까?

사용자가 강제로 세션을 새로 고치거나 시간을 초과하도록 설정하려면 설정된 시간 후에 window.setTimeout()을 사용하여 Timeout.aspx로 리디렉션합니다. Timeout.aspx의 코드 숨김은 Session.Abort()를 호출하여 세션을 종료 할 수 있습니다. 세션을 계속 종료하려면 사용자가 다시 로그인해야합니다.

이 방법은 실제로 서버 시간 및 다른 요인에 따라 달라지는 경향이있는 세션 시간 초과보다 더 정확하고 신뢰할 수 있다고 생각합니다.

+0

좋은 해결책이지만 사용자가 여러 개의 탭이나 창을 열어두면 문제가 발생한다고 생각합니다. 백그라운드 탭이 표시되면 예기치 않은 로그 아웃이 발생할 수 있습니다. –

0

웹 서비스의 세션 상태를 사용하도록 설정 한 다음 웹 서비스가 히트되는 경우 global.asax에서만 읽을 수 있도록 SessionStateBehavior를 설정하면 좋다고 생각합니다. 라이프 사이클의 초기에이를 수행해야합니다.

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.setsessionstatebehavior(v=VS.100).aspx

+0

이것은 좋은 생각입니다. 불행히도 .Net 4.0에서만 사용할 수있는 것 같습니다. 3.5를 목표로하고 있습니다. –

+0

.NET 4.6을 타겟팅하고 있습니다. 이것을 시도하고 실제로 작동합니까? –

0

나는 당신이 이것에 대해 잘못된 길을 가고있다 ... 당신이 절대적으로 다음 단지의 경우 어디 처리 (이 문제를 처리하는 가장 쉬운 방법으로) 간단한 메타 새로 고침을 사용할 수없는 경우 생각 AJAX 메서드는 세션이 시간 초과되었음을 나타내는 값을 반환합니다. 왜이 일을하기 위해서 왜 여분의 메커니즘이 필요한가요? 저는 UpdatePanel에 익숙하지 않습니다 ... 그러나 세션이 만료되었을 때 업데이트가 실패하면 반드시 "hey pardner, 다시 로그인해야합니다"라는 메시지를 다시 보낼 수 있습니까?

+0

ajax 반환 값을 처리하는 것만으로는 충분하지 않습니다. 사용자가 컴퓨터를 들고 걸어올 때와 같이 일정 시간 사용하지 않으면 브라우저가 Timeout.aspx로 자동으로 리디렉션해야하기 때문입니다. 이 경우 서버에 대한 아약스 호출이 없습니다. –

2

이것은 지금까지 생각해 낸 최고의 솔루션이지만, 나는 더 나은 것을 열어두고 있습니다. 기본적으로 모든 비동기 포스트 백과 함께 재설정되는 15 분짜리 자바 스크립트 타이머가 있습니다. 이 접근법의 단점은 사용자가 다른 브라우저 창에서 응용 프로그램을 활발하게 사용하고 있더라도 백그라운드에서 열린 두 번째 탭 또는 창으로 인해 세션이 종료되는 것입니다.

이와 비슷한 내용이 내 마스터 페이지에 있습니다. 자바 스크립트의 마지막 줄은 업데이트 패널이 새로 고쳐 때 트리거 내 리셋 기능을 추가

 <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError"> 
     <Scripts > 
      <asp:ScriptReference Path="~/scripts/jquery/jquery-1.3.2.min.js" /> 
     </Scripts> 
     </asp:ScriptManager> 

     <script type="text/javascript"> 

     var redirectTimer = setTimeout('redirectToLogout()', 900000); 

     function redirectToLogout() { 
      window.location = "/logout.aspx"; 
     } 

     function ResetTimeoutTimer() { 
      clearTimeout(redirectTimer); 
      redirectTimer = setTimeout('redirectToLogout()', 900000); 
     } 


     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer); 

     </script>