سؤال

طيب سؤال بسيط.لدي تطبيق JSF، يحتوي على صفحة تسجيل الدخول.تكمن المشكلة في أنه إذا قام المستخدم بتحميل صفحة تسجيل الدخول، وتركها لفترة من الوقت، ثم حاول تسجيل الدخول، تنتهي صلاحية الجلسة ويتم طرح ViewExpiredException.يمكنني إعادة التوجيه مرة أخرى إلى تسجيل الدخول عندما يحدث ذلك، لكن هذا ليس بالأمر السهل.كيف يمكنني السماح لهذا التدفق بتسجيل الدخول بشكل صحيح دون محاولة إضافية؟

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

المحلول

تحديث

اعتبارًا من Mojarra 2.1.19 / 2.2.0، يمكنك الآن تعيين السمة المؤقتة لـ <f:view> إلى صحيح:

<f:view transient="true">
     Your regular content
</f:view>

يمكنك أن تقرأ عنها في بالوسك المدونة هنا:

http://balusc.blogspot.com.br/2013/02/stateless-jsf.html

إبداعي

إذا كنت تستخدم Facelets، فيمكنك إنشاء ViewHandler الخاص بك للتعامل مع هذا:

public class LoginViewHandler extends FaceletViewHandler
{
    public LoginViewHandler( ViewHandler viewHandler )
    {
        super( viewHandler );
    }

    @Override
    public UIViewRoot restoreView( FacesContext ctx, String viewId )
    {
        UIViewRoot viewRoot = super.restoreView( ctx, viewId );

        if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
        {
            // Work around Facelet issue
            initialize( ctx );

            viewRoot = super.createView( ctx, viewId );
            ctx.setViewRoot( viewRoot );

            try
            {
                buildView( ctx, viewRoot );
            }
            catch ( IOException e )
            {
                log.log( Level.SEVERE, "Error building view", e ); 
            }
        }

        return viewRoot;
    }
}

قم بتغيير "/login.xhtml" إلى صفحة تسجيل الدخول الخاصة بك.يتحقق هذا لمعرفة ما إذا كان بإمكانه استعادة طريقة العرض الخاصة بك، وإذا لم يكن بإمكانه ذلك وكان العرض الحالي هو صفحة تسجيل الدخول الخاصة بك، فسوف يقوم بإنشاء العرض وإنشائه لك.

اضبط هذا في ملف Face-config.xml كما يلي:

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>

إذا كنت تستخدم JSF بدون Facelets (أي.JSPs) يمكنك محاولة جعل الفصل يقوم بتوسيع ViewHandlerWrapper - لاحظ أن buildView() لن يكون متاحًا.نأمل أن يقوم createView() بمفرده بإعداد العرض بشكل صحيح ولكني لست متأكدًا بنسبة 100٪ من JSF/JSP.

نصائح أخرى

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

ومع التخطيط الاستراتيجي المشترك يمكنك تعطيل جلسة لصفحة بما في ذلك هذا <%@ page session="false" %> التوجيه. يجب أن يكون هناك شيء مماثل للمساهمة في المشروع.

زوجان من الحلول المتسللة قليلاً:

  • (اختراقي جدًا) استخدم أ <meta http-equiv="refresh" content="5"/> علامة لإعادة تحميل الصفحة تلقائيًا بين الحين والآخر.
  • استخدم وظيفة JavaScript لإرسال طلب "ping" بشكل دوري إلى الخادم لإبقاء الجلسة نشطة.

نحن نستخدم وجوه ثلجية في العمل الذي يكتشف تلقائيًا موعد انتهاء جلستك ويعرض نافذة منبثقة تنبهك إلى الحقيقة.ولكن لا نزال نواجه أحيانًا مشكلات في صفحة تسجيل الدخول لسبب ما.

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