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

Status: Resolved
Project: Teeda
Component/s: Teeda Extension
Affects Version/s: 1.0.10
Fix Version/s: 1.0.11

Type: Bug Priority: Major
Reporter: azusa Assignee: koichik
Resolution: Fixed Votes: 0
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)

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



 Comments   
Comment by koichik [ 2007-09-15 ]

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

Comment by koichik [ 2007-09-15 ]

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

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

Comment by azusa [ 2007-07-06 ]

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

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

Generated at Wed Apr 09 09:01:15 JST 2025 using Jira 10.5.0#10050000-sha1:9d9d098bb7b67e8dba8da380ba9c3900d82ac3cf.