문제

우리의 응용 프로그램 로그오프 후 30min 와 리디렉션하여 로그인 페이지,나는 지정하는 세션 제한 시간 web.xml 사용 requestProcessor 리다이렉션.을 보여주고 싶은 사용자에게 말하는 메시지 세션이료되면 세션이 만료되면,어떻게 할 수 있습니다.자동 로그인가?난 프롬프트가 오류 메시지가 페이지에서"세션 시간 제한,다시 로그인하십시오".다음 방법할 수 있었을 감지하는 세션 시간 제한?이 어떤 방법을 자동으로 트리거?

도움이 되었습니까?

해결책

사용자 활동이 수행 된 경우 (MouseClick, Keypress) 사용자 활동이 수행되고 사용자가 활성화 될 때 세션을 유지하고 사용자가 활성화되어 있지 않을 때 아무 것도 없을 때 아무 것도없는 경우에도 서버 측으로 매분을 확인하는 활동 검사기를 만듭니다....에30 분 동안 활동이 없을 때 (또는 서버 측에서 기본 세션 시간 초과가 설정된 경우), 리디렉션을 수행하십시오.

jquery juquery 이벤트 및 화재 Ajax 요청을 거의 사용할 수 없습니다.

<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {
        $.active = false;
        $('body').bind('click keypress', function() { $.active = true; });
        checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
    });

    function checkActivity(timeout, interval, elapsed) {
        if ($.active) {
            elapsed = 0;
            $.active = false;
            $.get('heartbeat');
        }
        if (elapsed < timeout) {
            elapsed += interval;
            setTimeout(function() {
                checkActivity(timeout, interval, elapsed);
            }, interval);
        } else {
            window.location = 'http://example.com/expired'; // Redirect to "session expired" page.
        }
    }
</script>
.

Servlet에서 수신 대기하는 /heartbeat를 만듭니다. 기본적으로 다음과 같은 작업을 수행합니다.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    request.getSession();
}
.

세션을 살아있게하십시오.

세션에 로그인 한 사용자를 저장할 때 세션이 만료 될 때마다 "자동으로"로그 아웃됩니다.따라서 수동으로 사용자를 로그 아웃 할 필요가 없습니다.

다른 팁

을 만들 수신기를 구현하는 클래스 HttpSessionListener 과에서 정의 web.xml

이를 통지할 경우 모든 세션은 파괴되었다.사 sessionDestroyed() 방법입니다.

표시 전체를 들어 여기:

http://www.mkyong.com/servlet/a-simple-httpsessionlistener-example-active-sessions-counter/

간단한 서블릿 일 수도 있고 Spring-MVC 또는 Spring-Security Auto Logout은 완벽한 클라이언트 측 논리 없이는 불가능합니다.
응용 프로그램을 고려할 때 두 가지 유형의 요청이 모두

  • ajax 및
  • 양식 제출 / 페이지 재 장전

자동 로그 아웃은 매우 계산 된 논리가 필요합니다. 다음과 같은 내용 기능 구현 제시

이점.


1. 추가 호출 / 요청이이를 달성하기 위해 사용되지 않습니다. 성능 영향을 고려하여 10K 이상의 활성 사용자와 자동 로그 아웃을 달성 할 수있는 추가 호출이있는 경우 2. 태그를 사용한 한 줄 구성.

3. 사용자가 여러 개의 탭 또는 여러 창을 엽니 다 기르게 작동하더라도 완벽하게 작동합니다.
4. 30 초 전에 세션 무효화를 시작하기 전에 당신을 친절하게 만듭니다. 그래서 양식을 작성하고 제출하지 않으면 세션을 살아있게 할 수 있습니다 (한 번의 클릭으로 세션 확장). 그래서 사용자가 저장되지 않은 데이터를 느슨하게 할 가능성이 적습니다.

사용량


1. 필수 JSP 페이지에서 자동 로그 아웃 스크립트를 다음과 같이 포함하십시오.

    ....
    </body>
    <jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
.

2. JSP 페이지, autologout-script.jsp를 작성하고 아래 코드를 추가하십시오. 참고 : 편집 / 구성 없음

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<script>
$(document).ready(function()
{
    var timeOutTimeInSeconds = ${ timeOutTimeInSeconds }; 
    var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

    var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
    var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
    var badgeTimerId;
    window.localStorage.setItem("AjaxRequestFired", new Date());

    function redirectToLoginPage(){
        //location.href =  '<c:url value="/" />'+'${loginPageUrl}';
        window.location.reload();
    }

    $(document).ajaxComplete(function () {
        resetTimer();
    });

    $(window).bind('storage', function (e) {
         if(e.originalEvent.key == "AjaxRequestFired"){
             console.log("Request sent from another tab, hence resetting timer")
             resetTimer();
         }
    });

    function resetTimer()
    {
        showTimerTimeInSeconds= ${ showTimerTimeInSeconds };

        console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
        window.localStorage.setItem("AjaxRequestFired", new Date());

        window.clearInterval(sessionCheckIntervalId);
        sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);

        window.clearInterval(timerDisplayIntervalId);
        timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);

        hideTimer();
    }

    function showTimer()
    {
        $('#sessionTimeRemaining').show();
        $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        window.clearInterval(timerDisplayIntervalId);
        badgeTimerId = setInterval(function(){
            $('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
        }, 1000);
    }

    function hideTimer()
    {
        window.clearInterval(badgeTimerId);
        $('#sessionTimeRemaining').hide();
    }
});
</script>
.

3. 시간 초과 설정 구성 을 구성하도록 세션 속성 구성 참고 : 세션 생성 후에이 작업을 구성하십시오. httpsessionlistener sessioncreated 메소드를 구현하고 요구 사항에 따라 다음 구성을 설정할 수 있습니다.

session.setMaxInactiveInterval(300);

session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);

.

4. 타이머를 표시하려면 HTML이 추가됩니다.
참고 : CSS에서 좋은 경우 AutoLogout-Script 템플릿 페이지로 이동할 수 있습니다. 따라서 각 페이지 에이 항목을 추가하지 않아도됩니다.
부트 스트랩을 포함하거나 사용자 정의 CSS를 추가하십시오.

<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining" 
    onclick="ajaxSessionRefresh()" style="display:none;">
    <i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
     &nbsp; 
     <small>Refresh</small>
     <i class="glyphicon glyphicon-refresh"></i>
</span>
.

여기에 이미지 설명을 입력하십시오 >>

그것은 간단한 자동 로그 아웃 구현에 관한 모든 것입니다. 내 GitHub 저장소에서 작업 예제를 다운로드 할 수 있습니다
간단한 서블릿 예제를 사용하여 Autologout 스프링 보안 Java 구성 예제를 사용하여 자동학과


스프링 보안 XML 구성 예제를 사용하여 Autologout

로직은

를 설명했습니다


사례 1 : 페이지로드
여기에 Logic은 페이지로드 equlas의 페이지로드 세트 타이머에 MaxInactiveInterval입니다. 타임 아웃 이후 로그인 페이지로 리디렉션됩니다.
케이스 2 : Ajax 전화를 추적
이제 AJAX 요청을 고려하면 .ajaxstart () 또는 .ajaxcomplete () jQuery의 콜백을 사용할 수 있으므로 AJAX 요청이 해고되면 간격을 재설정 할 수 있습니다.
사례 3 : 멀티 탭 / 창 활동 추적
InterTAB 통신은 각 탭의 상태를 동기화하기 위해 수행됩니다. 변경 이벤트에 사용되는 LocalStorage.

제한 / 개선 필수
1. 허용 된 최대 세션이 하나 인 경우 다른 시스템에서 세션을 가져 왔으면 Ajax 요청이 실패합니다. 로그인 페이지로 리디렉션하기 위해 처리해야합니다.
2. ajaxcomplete () 대신 ajaxstart ()를 사용하여 서버와 브라우저간에 IdleTime 값을 정확하게 동기화합니다.

요구 사항
1. jQuery

전류 구현의 대안 비교


1. HTTP 응답에서 새로 고침 헤더 설정. (Ajax 요청에 사용할 수 없음)

response.setHeader("Refresh", "60; URL=login.jsp");
.

  1. 메타 새로 고침 태그 설정 (Ajax 요청에 사용할 수 없음)
  2. <meta http-equiv="refresh" content="60; url=login.jsp">
    
    .
    1. 활동 검사기 구성 반복적으로 AJAX 요청으로 세션을 계속 유지합니다. 유휴 시간을 추적하고 시간 초과 후에 로그 아웃 요청을합니다.
      의심의 여지가 간단한 논리가있는 좋은 것입니다. 그러나 나는 내 관찰을 잉크로 잉크로하고 싶습니다.
      • 성능 충격 2 분당 2 개의 요청이 세션을 유지하고 50K 활성 사용자를 유지하는 데 필요한 경우. 분당 100K 요청.
      • intertab 통신 두 개의 탭이 열려있는 경우 하나의 탭은 활동을 수신하지만 다른 탭이 활동을 수신하지 않고 다른 탭에 활동이 있더라도 해당 탭이 로그 아웃 요청 및 무효화됩니다. (그러나 취급 될 수 있음)
      • 강제 로그 아웃 접근 클라이언트가 세션을 무효화하기 위해 서버를 통해 지배적입니다.

서블릿 세션을 사용하는 경우 JSP / 서블릿이 isNew () 메서드를 사용하여 새로 반환하는 세션이 새로 사용되는지 확인할 수 있습니다.그렇다면 사용자의 세션이 만료되었고 관련 메시지를 표시 할 수 있습니다.

JSP 안에 JavaScript 유틸리티 기능을 포함하고 31 분마다 서버를 핑합니다. 위에서 언급 한 유틸리티 기능은 SetTimeout () JS 기능을 내부적으로 사용해야합니다.

setTimeout ( "checkServerSession()",  /* intervalInMilliSeconds */ 31000);
.

에 유의하십시오

checkserversionsession ()

는 HTTP 요청을 해칠 수있는 일반 JS 기능입니다.요청이 성공한 세션이있는 경우 사용자에게 프롬프트를 표시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top