【问题标题】:How to avoid illegal state exception?如何避免非法状态异常?
【发布时间】:2011-02-23 14:30:43
【问题描述】:

每次我从服务器收到“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:33,326 错误 [[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) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.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) 在 org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:423) 在 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)

【问题讨论】:

    标签: java servlets jboss error-handling


    【解决方案1】:

    我让它工作了,我想我知道为什么——这个 405 异常似乎不止一次发生,所以处理程序第二次捕获它时,响应已经提交。这解决了我的问题:

    @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;
    }
    

    【讨论】:

      【解决方案2】:

      我不确定这是否可行,你不能直接在 location 属性中给出 URL 吗?

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

      编辑: 好的,我发现上面的方法行不通。但是您自己发布的技术对我有用。所以我怀疑是通过过滤器或另一个 JSP 发生了多个重定向。

      【讨论】:

      • 这对我不起作用——我最初尝试过——并且客户端获取了 HTML 内容,但它仍然会出现 405 状态代码并显示为错误客户端。
      • 好吧,信不信由你,我尝试了您尝试过的方法,它对我有用。我尝试了 404,我的位置有一个 /NotFound servlet。
      • 我相信你。我假设的部分问题是响应在到达此方法之前已经提交。我想知道 404 和 405 错误之间是否有区别。
      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      相关资源
      最近更新 更多