如何避免非法状态异常?

时间:2011-02-23 14:30:44

标签: java servlets jboss error-handling

每当我从服务器获得“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的Servlet.service()   MethodNotAllowedHandler扔了   例外   java.lang.IllegalStateException at   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)

2 个答案:

答案 0 :(得分:0)

我得到它的工作,我想我知道为什么 - 似乎这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;
}

答案 1 :(得分:-1)

我不确定这是否有效,你不能直接在位置属性中提供URL吗?

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

编辑:好吧,我发现上述方法无效。但你发布的技术本身对我有用。所以我怀疑是通过过滤器或其他JSP发生了多次重定向。