java 如何避免非法状态异常?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5092222/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 09:22:43  来源:igfitidea点击:

How to avoid illegal state exception?

javaservletsjbosserror-handling

提问by Cuga

Every time I get a "405 method not allowed" response from the server, I want to redirect the user to a given url. However, I keep getting IllegalStateExceptions saying the response has already committed. Is there any way I can redirect the user without getting this exception?

每次我从服务器收到“405 method not allowed”响应时,我都想将用户重定向到给定的 url。但是,我不断收到 IllegalStateExceptions 说响应已经提交。有什么方法可以重定向用户而不会出现此异常?

I have the following servlet:

我有以下 servlet:

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

and the following entry in web.xml:

以及 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>

Thanks

谢谢

Edit:Meant to add the stack trace:

编辑:打算添加堆栈跟踪:

09:01:33,326 ERROR [[MethodNotAllowedHandler]] Servlet.service() for servlet MethodNotAllowedHandler threw exception java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) at com.ex.MethodNotAllowedHandler.doGet(MethodNotAllowedHandler.java:26) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:447) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) at 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) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Thread.java:619)

09:01:33,326 错误 [[MethodNotAllowedHandler]] servlet MethodNotAllowedHandler 的 Servlet.service() 在 com.ex 的 org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 抛出异常 java.lang.IllegalStateException。 MethodNotAllowedHandler.doGet(MethodNotAllowedHandler.java:26) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at 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) at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292) at 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.invoke(StandardHostValve.java:342) :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)

采纳答案by Cuga

I got it to work, and I think I know why-- it seems this 405 exception is occurring more than once, so the 2nd time the handler catches it, the response is already committed. This fixed my problem:

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

回答by adarshr

I'm not sure if this will work, can't you directly give the URL in the location attribute?

我不确定这是否可行,您不能直接在 location 属性中提供 URL 吗?

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

EDIT:Alright, I found that it won't work the above way. But the technique you have posted yourself worked for me. So what I suspect is that there are multiple redirects happening either through a filter or another JSP.

编辑:好的,我发现它不会以上述方式工作。但是你自己贴出来的技术对我有用。所以我怀疑是通过过滤器或另一个 JSP 发生了多次重定向。