Как избежать незаконного государственного исключения? - PullRequest
1 голос
/ 23 февраля 2011

Каждый раз, когда я получаю от сервера ответ «405 метод не разрешен», я хочу перенаправить пользователя на указанный URL-адрес. Тем не менее, я продолжаю получать IllegalStateExceptions, говоря, что ответ уже зафиксирован. Можно ли как-то перенаправить пользователя без получения этого исключения?

У меня есть следующий сервлет:

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 () для сервлета 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)

Ответы [ 2 ]

0 голосов
/ 24 февраля 2011

Я заставил его работать, и я думаю, что знаю почему - кажется, что это исключение 405 встречается более одного раза, поэтому во 2-й раз, когда обработчик его перехватит, ответ уже зафиксирован.Это исправило мою проблему:

@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;
}
0 голосов
/ 23 февраля 2011

Я не уверен, что это сработает, вы не можете напрямую указать URL в атрибуте location?

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

РЕДАКТИРОВАТЬ: Хорошо, я обнаружил, что это не будет работать вышеуказанным способом. Но техника, которую вы разместили самостоятельно, сработала для меня. Так что я подозреваю, что несколько перенаправлений происходит либо через фильтр, либо через другой JSP.

...