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

转载。。。。。。。。。。。。

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.

猜你喜欢

转载自hbbtym.iteye.com/blog/1766020