[Spring]请求转发时出现405错误,抛出IllegalStateException异常

版权声明:本文为博主原创文章,转载请申明出处,感谢。 https://blog.csdn.net/shichimiyasatone/article/details/86526292

问题情境:

问题出现在尝试代码实现SpringMVC主要流程时,DispatcherServlet中service()方法执行到最后一步报错。

// 此句代码执行时抛异常,页面405
request.getRequestDispatcher(result.getView()).forward(request, response);

控制台的异常信息:

java.lang.IllegalStateException: Cannot forward after response has been committed
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:326)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
	at com.yangyi.dispatcher.DispatcherServlet.service(DispatcherServlet.java:81)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	// 此处省略部分打印内容
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

页面显示:

问题原因:

在DispatcherServlet中重写service()方法时没有去掉自动添加的super.service(request, response),导致此处显示调用父类HttpServlet的service()方法。在父类的该方法中,调用了doGet()或doPost()方法。这两个方法默认返回405或者400,所以页面显示405错误或400错误。又因为本次请求在父类的service()方法中已经响应完成,再次尝试转发或重定向将会抛出IllegalStateException异常。

HttpServlet中doGet()和doPost()方法源码实现内容为:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取协议 
        String protocol = req.getProtocol();
        //获取http.method_get_not_supported的国际化字符串
        String msg = lStrings.getString("http.method_get_not_supported");
        if(protocol.endsWith("1.1")) {
        //如果是HTTP/1.1,返回405禁止访问方法错误
            resp.sendError(405, msg);
        } else {
        //如果不是HTTP/1.1,返回400错误的请求错误  
            resp.sendError(400, msg);
        }
 
}
 
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        if(protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }
 
}

解决办法:

在仅重写service()方法时,不显示调用父类service()方法,将eclipse自动添加的super.service(request, response)去掉即可。

参考:

https://blog.csdn.net/sinat_32560085/article/details/70144760

猜你喜欢

转载自blog.csdn.net/shichimiyasatone/article/details/86526292