Uploaded image for project: 'Teeda'
  1. Teeda
  2. TEEDA-326

エラーページの表示中に,現在のエラーページを表示する条件とマッチする例外が発生すると,無限リダイレクトになる問題を修正しました.

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.0.10
    • Fix Version/s: 1.0.11
    • Component/s: Teeda Extension
    • Labels:
      None
    • Environment:
      1.0.8-RC1

      Description

      エラーページ表示時、エラーページに設定されているインターセプター内で例外が発生すると、無限リダイレクトが発生する。

      java.lang.RuntimeException
      at org.seasar.mistral.interceptor.LoginInterceptor.invoke(LoginInterceptor.java:61)
      at org.seasar.mistral.web.error.ErrorPage$$EnhancedByS2AOP$$173c52f$$MethodInvocation$$prerender0.proceed(MethodInvocationClassGenerator.java)
      at org.seasar.mistral.web.error.ErrorPage$$EnhancedByS2AOP$$173c52f.prerender(ErrorPage$$EnhancedByS2AOP$$173c52f.java)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.seasar.framework.util.MethodUtil.invoke(MethodUtil.java:73)
      at org.seasar.framework.beans.impl.BeanDescImpl.invoke(BeanDescImpl.java:213)
      at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl.invoke(HtmlComponentInvokerImpl.java:159)
      at org.seasar.teeda.extension.render.TViewRootRenderer.invoke(TViewRootRenderer.java:298)
      at org.seasar.teeda.extension.render.TViewRootRenderer.invoke(TViewRootRenderer.java:292)
      at org.seasar.teeda.extension.render.TViewRootRenderer.encodeBegin(TViewRootRenderer.java:139)
      at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:330)
      at javax.faces.component.UIViewRoot.encodeBegin(UIViewRoot.java:100)
      at javax.faces.webapp.UIComponentTag.encodeBegin(UIComponentTag.java:240)
      at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:177)
      at org.seasar.teeda.extension.taglib.TViewTag.doStartTag(TViewTag.java:90)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.processTag(ElementProcessorImpl.java:145)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.process(ElementProcessorImpl.java:138)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.process(ElementProcessorImpl.java:119)
      at org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHandler.java:145)
      at org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHandler.java:135)
      at org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase.executePhase(RenderResponsePhase.java:38)
      at org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:55)
      at org.seasar.teeda.core.lifecycle.LifecycleImpl.render(LifecycleImpl.java:128)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:93)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:63)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:64)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
      at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
      at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
      at java.lang.Thread.run(Thread.java:595)
      ERROR 2007-07-06 16:10:19,411 [http-8080-Processor25] [ETDA0029]既にリダイレクトされています。
      org.seasar.teeda.core.exception.AlreadyRedirectingException: [ETDA0029]既にリダイレクトされています。
      at org.seasar.teeda.extension.util.TeedaExtensionErrorPageManagerImpl.handleException(TeedaExtensionErrorPageManagerImpl.java:76)
      at org.seasar.mistral.MistrsalErrorPageManagerImpl.handleException(MistrsalErrorPageManagerImpl.java:40)
      at org.seasar.teeda.extension.html.impl.HtmlComponentInvokerImpl.invoke(HtmlComponentInvokerImpl.java:178)
      at org.seasar.teeda.extension.render.TViewRootRenderer.invoke(TViewRootRenderer.java:298)
      at org.seasar.teeda.extension.render.TViewRootRenderer.invoke(TViewRootRenderer.java:292)
      at org.seasar.teeda.extension.render.TViewRootRenderer.encodeBegin(TViewRootRenderer.java:139)
      at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:330)
      at javax.faces.component.UIViewRoot.encodeBegin(UIViewRoot.java:100)
      at javax.faces.webapp.UIComponentTag.encodeBegin(UIComponentTag.java:240)
      at javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:177)
      at org.seasar.teeda.extension.taglib.TViewTag.doStartTag(TViewTag.java:90)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.processTag(ElementProcessorImpl.java:145)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.process(ElementProcessorImpl.java:138)
      at org.seasar.teeda.extension.html.processor.ElementProcessorImpl.process(ElementProcessorImpl.java:119)
      at org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHandler.java:145)
      at org.seasar.teeda.extension.html.impl.HtmlViewHandler.renderView(HtmlViewHandler.java:135)
      at org.seasar.teeda.core.lifecycle.impl.RenderResponsePhase.executePhase(RenderResponsePhase.java:38)
      at org.seasar.teeda.core.lifecycle.AbstractPhase.execute(AbstractPhase.java:55)
      at org.seasar.teeda.core.lifecycle.LifecycleImpl.render(LifecycleImpl.java:128)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:93)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.framework.container.hotdeploy.HotdeployFilter.doFilter(HotdeployFilter.java:63)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:64)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
      at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
      at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
      at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
      at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
      at java.lang.Thread.run(Thread.java:595)

      の二つの例外の繰り返しになる。

        Activity

        Hide
        azusa azusa added a comment -

        回避策は、pageに独自のインターセプターを適用するときは、ErrorPageに適用しないようにする。

        <initMethod name="addIgnoreClassPattern">
        <arg>"org.seasar.mistral.web.error"</arg>
        <arg>"ErrorPage"</arg>
        </initMethod>

        Show
        azusa azusa added a comment - 回避策は、pageに独自のインターセプターを適用するときは、ErrorPageに適用しないようにする。 <initMethod name="addIgnoreClassPattern"> <arg>"org.seasar.mistral.web.error"</arg> <arg>"ErrorPage"</arg> </initMethod>
        Hide
        koichik koichik added a comment -

        対応しました.
        http://svn.seasar.org/browse/?view=rev&root=teeda&revision=3582

        エラーページにリダイレクトされてきたページクラスの initialize/prerender で例外が発生すると,HtmlComponentInvokerImpl が例外をキャッチして TeedaExtensionErrorPageManagerImpl に渡します.そこで次のリダイレクト先となるエラーページが現在表示しようとしていたエラーページと同じ場合は AlreadyRedirectingException をスローします.
        この例外は LifecycleImpl がキャッチして再び TeedaExtensionErrorPageManagerImpl に渡りますが,この時はリダイレクトスコープの情報が失われているため,同じページへのリダイレクトを防ぐことができていませんでした.
        そこで,AlreadyRedirectingException についてはリダイレクトしないようにしました.

        Show
        koichik koichik added a comment - 対応しました. http://svn.seasar.org/browse/?view=rev&root=teeda&revision=3582 エラーページにリダイレクトされてきたページクラスの initialize/prerender で例外が発生すると,HtmlComponentInvokerImpl が例外をキャッチして TeedaExtensionErrorPageManagerImpl に渡します.そこで次のリダイレクト先となるエラーページが現在表示しようとしていたエラーページと同じ場合は AlreadyRedirectingException をスローします. この例外は LifecycleImpl がキャッチして再び TeedaExtensionErrorPageManagerImpl に渡りますが,この時はリダイレクトスコープの情報が失われているため,同じページへのリダイレクトを防ぐことができていませんでした. そこで,AlreadyRedirectingException についてはリダイレクトしないようにしました.
        Hide
        koichik koichik added a comment -

        ちなみに,Opera では無限リダイレクトにはなりません.同じ URL へのリダイレクトが続くと「このURLは~にリダイレクトされています。ページにジャンプするにはリンクをクリックしてください。」が表示されて止まります.
        やっぱり IE ダメポ.

        Show
        koichik koichik added a comment - ちなみに,Opera では無限リダイレクトにはなりません.同じ URL へのリダイレクトが続くと「このURLは~にリダイレクトされています。ページにジャンプするにはリンクをクリックしてください。」が表示されて止まります. やっぱり IE ダメポ.

          People

          • Assignee:
            koichik koichik
            Reporter:
            azusa azusa
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development