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

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

      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)

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

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

          koichik added a comment -

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

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

          koichik added a comment -

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

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

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

          azusa added a comment -

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

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

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

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

              Created:
              Updated:
              Resolved: