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

本文深入探讨了在SpringMVC框架下,DispatcherServlet在处理请求时出现405错误的原因及解决方案。错误源于父类HttpServlet的doGet/doPost方法默认返回405或400错误,且在请求已响应的情况下尝试转发或重定向会抛出IllegalStateException异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题情境:

问题出现在尝试代码实现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.youkuaiyun.com/sinat_32560085/article/details/70144760

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值