java.lang.IllegalStateException: Cannot forward after response has been committe

[color=red][size=large]问题描述:[/size][/color]

java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward

(ApplicationDispatcher.java:312)
at org.apache.catalina.core.ApplicationDispatcher.forward

(ApplicationDispatcher.java:302)
Dec 17, 2012 7:21:15 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet SelectServlet threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward

(ApplicationDispatcher.java:312)
at org.apache.catalina.core.ApplicationDispatcher.forward

(ApplicationDispatcher.java:302)
at com.servlet.SelectServlet.doPost(SelectServlet.java:110)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest

(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward

(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward

(ApplicationDispatcher.java:302)
at com.servlet.LoginServlet.doPost(LoginServlet.java:77)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process

(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
at com.servlet.SelectServlet.doPost(SelectServlet.java:110)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest

(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward

(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward

(ApplicationDispatcher.java:302)
at com.servlet.LoginServlet.doPost(LoginServlet.java:77)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
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.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process

(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)



[color=red][size=medium]错误重点截取:[/size][/color]

org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet SelectServlet threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed


[color=red][size=large]解决方案:[/size][/color]


A common misunderstanding among starters is that they think that the call of a forward() or a sendRedirect() would magically exit and "jump" out of the method block, hereby ignoring the remnant of the code. For example:
protected void doPost() {
if (someCondition) {
sendRedirect();
}
forward(); // This is STILL invoked when someCondition is true!
}

This is thus actually not true. They do certainly not behave differently than any other Java methods (expect of System#exit() of course). When the someCondition in above example is true, then the chance is big that you will get an IllegalStateException: Cannot forward after response has been committed. This is regardless of whether the if statement calls a sendRedirect() or a forward().

To fix this, you need to add a return; statement afterwards
protected void doPost() {
if (someCondition) {
sendRedirect();
return;
}
forward();
}

... or to introduce an else block.
protected void doPost() {
if (someCondition) {
sendRedirect();
} else {
forward();
}
}

To naildown the root cause in your code, just search for any line which calls a sendRedirect() or a forward() without exiting the method block or skipping the remnant of the code. This can be inside the same servlet before the particular code line, but also in any servlet or filter which was been called before the particular servlet.

添加else语句或者添加return ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值