Tapestry5 استثناء تسجيل الدخول
سؤال
أواجه مشكلة غريبة ولا يمكنني معرفة السبب الجذري. هنا هو بيان المشكلة.
لدي صفحة نسيج واحدة مع زر تسجيل الدخول. عندما أقوم بالنقر فوق زر تسجيل الدخول ، يتم تنفيذ الرمز أدناه وأحصل على الاستثناء.
// 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
لأن عملية الكود الداخلي في الجلسة.
إذن هذا هو الحل.
- لقد قمت بإنشاء مرشح واحد اسمه
LogOutFilter
. - في web.xml وضعته من قبل
RMOpenEJBFilter
(لغرض تصفية المرشح). - في رمز تسجيل الدخول الخاص بي ، أقوم بإعداد متغير واحد في الجلسة
request.getSession(false).setAttribute("InvalidateSession", true);
- لذلك عندما أقوم بالنقر فوق زر تسجيل الدخول ، يقوم بتعيين سمة الجلسة ، ثم ينتقل إلى
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;
}