سؤال

أواجه مشكلة غريبة ولا يمكنني معرفة السبب الجذري. هنا هو بيان المشكلة.

لدي صفحة نسيج واحدة مع زر تسجيل الدخول. عندما أقوم بالنقر فوق زر تسجيل الدخول ، يتم تنفيذ الرمز أدناه وأحصل على الاستثناء.

// method which called onclick of logout button. 
@OnEvent(value = EventConstants.ACTION, component = "tlogout")
public Object logout()
{
    request.getSession(false).invalidate();
    return "Login";
}

الاستثناء هو:

INFO  | net.awl.tapestry5.kawwa.services.KawwaModule.TabLocator | 2011-01-05 14:33:23,321
   > Checking for any UPDATES

INFO  | net.awl.bfi.websuite.services.AppModule.TimingFilter | 2011-01-05 14:33:23,352
   > Request time: 31 ms

ERROR | org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/WebSuiteMoreaTapestry].[default] | 2011-01-05 14:33:23,352
   > Servlet.service() for servlet default threw exception

java.lang.IllegalStateException: Cannot create a session after the response has been committed
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2221)
    at org.apache.catalina.connector.Request.getSession(Request.java:2031)
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:832)
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:843)
    at net.atos.xa.rm.jaas.openejb.web.RMOpenEJBFilter.doFilter(RMOpenEJBFilter.java:89)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.openejb.tomcat.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:595)

أي فكرة يا رفاق؟ يعتبر،
ماهيندرا

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

المحلول

شكرا على وقتك وتعليقاتك! مع بعض المناقشة الجيدة ، وجدت أخيرًا الحل وأشاركه معك.

في قضيتي طلب/استجابة من خلال RMOpenEJBFilter. لذا ، عندما أطلقت الجلسة في الكود الخاص بي ، تحطمت RMOpenEJBFilter لأن عملية الكود الداخلي في الجلسة.

إذن هذا هو الحل.

  1. لقد قمت بإنشاء مرشح واحد اسمه LogOutFilter.
  2. في web.xml وضعته من قبل RMOpenEJBFilter (لغرض تصفية المرشح).
  3. في رمز تسجيل الدخول الخاص بي ، أقوم بإعداد متغير واحد في الجلسة

request.getSession(false).setAttribute("InvalidateSession", true);

  1. لذلك عندما أقوم بالنقر فوق زر تسجيل الدخول ، يقوم بتعيين سمة الجلسة ، ثم ينتقل إلى RMOpenEJBFilter حيث تقوم بمعالجة الطلب (حتى لا يتم إبطال جلسة الوقت). الآن السيطرة يذهب إلى LogOutFilter حيث أجريت شيكًا لإبطال الجلسة.

if (httpRequest.getSession(false) != null && httpRequest.getSession(false).getAttribute("InvalidateSession") != null) { httpRequest.getSession(false).invalidate(); }

والآن يعمل بشكل جيد.

آمل أن يكون حلي جيدًا بما يكفي للقبول.

لا تتردد في الاتصال بي للحصول على أي توضيح.

يعتبر،
ماهيندرا أثيرغ
مومباي، الهند

نصائح أخرى

أعتقد أنك لا تحتاج إلى مرشح. فقط أضف الإجراء التالي لتسجيل الدخول.

@OnEvent("Logout")
    private Object onActionFromLogout() {
        Session session = requestGlobals.getRequest().getSession(false);
        if (session != null) {
            session.invalidate();
        }

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