سؤال

يتم تسجيل خروج تطبيقنا بعد 30 دقيقة ويتم إعادة توجيهه إلى صفحة تسجيل الدخول، وأنا أحدد مهلة الجلسة في web.xml وأستخدم معالج الطلب لإعادة التوجيه. أريد أن أعرض للمستخدم رسالة تفيد بأن جلستك قد انتهت بمجرد انتهاء الجلسة، كيف يمكنني أن أفعل ذلك. تسجيل الخروج التلقائي؟أرغب في ظهور رسالة الخطأ على الصفحة "انتهت مهلة الجلسة، يرجى تسجيل الدخول مرة أخرى".إذن كيف يمكنني اكتشاف انتهاء مهلة الجلسة؟هل سيتم تشغيل أي طرق تلقائيًا؟

هل كانت مفيدة؟

المحلول

قم بإنشاء مدقق النشاط الذي يتحقق كل دقيقة من حدوث أي نشاط للمستخدم (النقر بالماوس، الضغط على المفاتيح) ويقوم بإجراء نبضات على جانب الخادم لإبقاء الجلسة نشطة عندما يكون المستخدم نشطًا ولا يفعل شيئًا عندما لا يكون المستخدم نشطًا.عندما لا يكون هناك أي نشاط لمدة 30 دقيقة (أو أي مهلة افتراضية تم تعيينها على جانب الخادم)، قم بإجراء إعادة التوجيه.

فيما يلي مثال على البداية مع القليل من المساعدة مسج لربط أحداث النقر والضغط على المفاتيح وإطلاق طلب 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/

إما أنها قد تكون بسيطة بريمج, ربيع-mvc أو الربيع الأمن السيارات الخروج ليس ممكنا من دون الكمال جانب العميل المنطق.
معتبرا التطبيق سوف يكون كل نوع من الطلب

  • اياكس ،
  • استمارة التقديم/تحديث الصفحة

لصناعة السيارات في الخروج الاحتياجات جدا حساب المنطق.التقديم يا autologout وظائف تنفيذ التالية

المزايا.


1.أي خارج الاتصال/طلب المستخدمة لتحقيق ذلك.النظر في تأثير الأداء إذا كان أكثر من 10 آلاف مستخدم نشط إضافية المكالمات إلى تحقيق لصناعة السيارات في الخروج.
2.واحد خط التكوين باستخدام الوسم.
3.يعمل لا تشوبه شائبة حتى إذا كان المستخدم بفتح تبويب متعددة أو عدة النافذة.
4.انها المقربين لك قبل 30 ثانية من الدورة إبطال, حتى إذا كان لديك شكل شغل و لا قدم ، يمكنك الاحتفاظ الدورة على قيد الحياة(تمديد الدورة من خلال نقرة واحدة).لذلك المستخدم أقل من المحتمل أن تفقد البيانات التي لم يتم حفظها.

الاستخدام


1.وتشمل السيارات الخروج النصي في صفحات JSP على النحو المبين أدناه.

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

2.إنشاء صفحة JSP, autologout النصي.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 لعرض الموقت.
ملاحظة:فإنه يمكن نقلها إلى autologout النصي قالب الصفحة إذا كنت جيدة في CSS.ومن ثم يمكنك تجنب لإضافة هذا في كل صفحة.
وتشمل التمهيد أو إضافة 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>

enter image description here

هذا هو كل شيء عن السيارات بسيطة الخروج التنفيذ.يمكنك تحميل سبيل المثال العمل من github
Autologout باستخدام بريمج بسيط سبيل المثال
Autologout باستخدام الربيع الأمن جافا التكوين سبيل المثال
Autologout باستخدام الربيع الأمن تكوين xml سبيل المثال

المنطق شرح


حالة 1:على تحميل الصفحة
هنا منطق بسيط ، على تحميل الصفحة تعيين جهاز ضبط الوقت الفاصل equlas إلى maxInactiveInterval.بعد مهلة إعادة توجيه إلى صفحة تسجيل الدخول.
الحالة 2:تتبع المكالمات اياكس
الآن النظر في طلبات اياكس, يمكنك استخدام .ajaxStart() أو .ajaxComplete() رد من مسج بحيث إذا أي طلب ajax أطلقت يمكنك إعادة تعيين الفاصل الزمني.
الحالة 3:تتبع متعدد التبويب/نافذة النشاط
Intertab ويتم التواصل لمزامنة الدولة من كل علامة تبويب.تستخدم localStorage على تغيير الحدث.

القيود/التحسينات المطلوبة
1.إذا كان الحد الأقصى المسموح به جلسة واحدة ، إذا كانت الدورة مأخوذ من نظام آخر ، طلب اياكس سوف تفشل.فإنه يحتاج التعامل معها إلى إعادة توجيه إلى صفحة تسجيل الدخول.
2.استخدام ajaxStart() بدلا من ajaxComplete() أن يكون بالضبط تزامن idleTime القيم بين الخادم و المتصفح.

متطلبات
1.مسج

بدائل التنفيذ الحالية مقارنة


1. الإعداد تحديث رأس في استجابة http. (لا يعمل على طلبات اياكس)

response.setHeader("Refresh", "60; URL=login.jsp");
  1. الإعداد تحديث ميتا الوسم في HTML (لا يعمل على طلبات اياكس)
<meta http-equiv="refresh" content="60; url=login.jsp">
  1. تكوين النشاط مدقق يبقي الدورة على قيد الحياة من خلال تكرار طلب اياكس.المسارات وقت الخمول و يجعل الخروج الطلب بعد مهلة.
    لا شك أنها فكرة جيدة مع المنطق البسيط.ولكن أريد أن مجرد حبر ملاحظاتي.
    • تأثير الأداء إذا 2 الطلبات في الدقيقة للحفاظ على الدورة على قيد الحياة 50 ألف مستخدم نشط.100k الطلبات في الدقيقة.
    • Intertab الاتصالات إذا اثنين من علامات التبويب فتح علامة تبويب واحدة يتلقى النشاط ولكن التبويب الأخرى لا يتلقى النشاط علامة التبويب هذه الحرائق الخروج طلب إبطال الدورة على الرغم من وجود نشاط في علامة التبويب غير ذلك.(ولكن يمكن التعامل معها)
    • القوة الخروج النهج بل هو عميل ويهيمن على الخادم أن يبطل الدورة.

إذا كنت تستخدم جلسات Servlet، فيمكنك التحقق لمعرفة ما إذا كانت الجلسة يتم إرجاع JSP / Servlet جديدا باستخدام طريقة ISNEW ().إذا كانت الإجابة بنعم، فقد انتهت صلاحية جلسة المستخدم ويمكنك عرض الرسائل ذات الصلة.

تضمين وظيفة فائدة JavaScript داخل JSP الخاص بك و ping الخادم كل 31 دقيقة. يجب أن تستخدم وظيفة الأداة المساعدة المذكورة أعلاه Settimeout () وظيفة JS داخليا.

giveacodicetagpre.

لاحظ أن

CheckServersion ()

هي وظيفة JS العادية التي قد تطلق طلب طلبات HTTP.إذا كان الطلب ناجحا، فإخلاء إظهار المطالبة للمستخدم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top