在一个roundtrip中response只能被发出一次,在一些验证码、文件下载中通过httpServletResponse.getOutputStream()和requestOutputStream.write()等方法已将response发出,再return ActionForward时被认为是再发送一次,因而报错。出现这种情况的时候,后面的return将只可以返回null,这可以由httpServletResponse.iscommitted()获知。
代码如下:
public class CheckCode extends BaseAction {
private static final long serialVersionUID = 1L;
public String execute() throws Exception {
String checkCode = String.valueOf(new Random().nextInt(8999)+1000);
this.getSession().setAttribute("ImageCode", checkCode);
CodeImage.getInstanse().getImage(this.getResponse(), checkCode);
/** add by zhangWei Feb 18, 2013 4:38:15 PM Reason : 这里添加一个判断,
* 如果response.isCommitted()==true,返回数据会导致再次发送一次response,
* 导致出现:Response already committed异常,返回null解决此问题*/
return this.getResponse().isCommitted()?null:SystemStaticConstant.SUCCESS;
}
}在CodeImage.getInstanse().getImage(this.getResponse(), checkCode);中有这么一行代码:
ImageIO.write(image, "JPEG", response.getOutputStream());
当在Struts Action中,使用httpServletResponse.getOutputStream()发送内容后,尝试返回ActionForward会抛出'Response already committed'错误。为避免此问题,可以在返回前检查httpServletResponse.isCommitted(),如果已提交,则返回null,否则返回正常的处理结果。
40万+

被折叠的 条评论
为什么被折叠?



