2011-02-23 406 views
1

每當我從服務器得到「405方法不允許」響應時,我想將用戶重定向到給定的url。但是,我不斷收到IllegalStateExceptions表示響應已經提交。有什麼方法可以重定向用戶而不會發生此異常?如何避免非法狀態異常?

我有以下的servlet:

public class MethodNotAllowedHandler extends HttpServlet { 
     @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException { 
     resp.sendRedirect("http://www.google.com"); 
    } 
} 

,並在web.xml中輸入以下內容:

<servlet> 
    <servlet-name>MethodNotAllowedHandler</servlet-name> 
    <servlet-class>com.ex.MethodNotAllowedHandler</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MethodNotAllowedHandler</servlet-name> 
    <url-pattern>/MethodNotAllowedHandler</url-pattern> 
</servlet-mapping> 
<error-page> 
    <error-code>405</error-code> 
    <location>/MethodNotAllowedHandler</location> 
</error-page> 

感謝

編輯:意味着添加的堆棧跟蹤:

09:01:33326 ERROR [[MethodNotAllowedHandler]] Servlet.service()進行的servlet MethodNotAllowedHandler投擲 例外 java.lang.IllegalStateException在 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java: 435) 在 com.ex.MethodNotAllowedHandler.doGet(MethodNotAllowedHandler.java:26) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 在 javax.servlet.http.HttpServlet.service (HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilter Chain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) 在 org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447) 在 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) 在 org.apache.catalina.core .ApplicationDispatcher.forward(ApplicationDispatcher.java:292) at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423) at 個org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:342) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) 在 org.apache.catalina.valves .ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 在 org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 在 org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583) 在 org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:446) 在 java.lang.Thread.run(Thread。java:619)

回答

0

我得到它的工作,我想我知道爲什麼 - 看起來這個異常不止一次發生,所以第二次處理器捕獲它,響應已經提交。這個固定我的問題:

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  
     ServletException, IOException { 
    if (!resp.isCommitted()) { 
     resp.sendRedirect("http://www.google.com"); 
    } else { 
     log.info(" Response was already committed!"); 
    } 
    return; 
} 
-1

我不確定這是否會起作用,您不能直接在location屬性中輸入URL嗎?

<error-page> 
    <error-code>405</error-code> 
    <location>http://www.google.com</location> 
</error-page> 

編輯:好吧,我發現,它不會工作上面的方式。但是你發佈的技術對我來說很合適。所以我懷疑有多個重定向通過過濾器或其他JSP發生。

+0

這不會對我 - 工作,我試過了originally--和客戶端獲取HTML內容,但它仍然會以405狀態碼來通過,並顯示爲一個客戶端錯誤。 – Cuga 2011-02-23 14:37:38

+0

呃,不管你信不信,我試過你試過的東西,它對我很有用。我嘗試了404,我的位置有一個/ NotFound servlet。 – adarshr 2011-02-23 14:43:59

+0

我相信你。我假設的部分問題是響應在獲得此方法之前已經提交。我想知道404和405錯誤之間是否有區別。 – Cuga 2011-02-23 14:57:22