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.