Can't sendRedirect() after data has committed to the client.

本文探讨了在Resin应用服务器中使用response.sendRedirect方法时出现的IllegalStateException异常。问题通常发生在压力测试环境下,原因是sendRedirect后未及时中断后续执行流程。文章提供了具体的解决办法,并通过示例验证了解决方案的有效性。

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

resin下

response.sendRedirect("XXX");

在压力测试下会报出

java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.

 

以前也碰到过这个问题,gg找了下,大都说是因为在sendRedirect前调用了out.flush();

实际上没有调用,一般也很少会去掉用out.flush();

 

然后碰到一个搜索结果说是在resin下,如果sendRedirect后不跟return;会出这个问题(确实没加!!)

遂全部加上return,重新测试,果然不出异常了!!

 

这是为什么呢?

 

终于找到一种说法

应该是你在做登陆时用户名和密码判断后,做的页面跳转有问题,按照异常来理解,应该是服务器已经返回了状态200或者404或者其他的状态码,但是又执行了重定向的代码,返回302状态码。服务器同一次相应应该只返回一种状态,建议最后把你的登陆判断逻辑完整的发上来看看

原来,response.sendRedirect执行后,应用服务器还是会执行接下去的代码的,所以一般都可以通过return语句中断

如果没有中断,而且接下去又有返回状态码的语句时,就会报这个错

 

写个例子测试下

 

response.sendRedirect(request.getAttribute("ROOT").toString() + "/");

response.sendRedirect(request.getAttribute("ROOT").toString() + "/");

 

执行后果然报错

 

之所以正常情况下不能重现,而压力测试下才会出现这问题, 我想纯属巧合吧, 压力测试有些操作不走流程, 逻辑上碰巧满足连着2次sendRedirect.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值