`

生成验证码图片的jsp和filter冲突的问题

    博客分类:
  • web
阅读更多

根据网上的资料,我写了一个jsp用来产生验证码图片,web server为tomcat5,

<%@ page contentType="image/jpeg" import="javax.imageio.*,com.netstar.util.CheckCodeImage" pageEncoding="GBK"%>

<%CheckCodeImage image=new CheckCodeImage();

//设置页面不缓存
response.setHeader("pragma","no-cache");
response.setHeader("cache-control","no-cache");
response.setDateHeader("expires", 0);

// 将认证码存入session
session.setAttribute("checkCode",image.srand);

// 输出图象到页面
ImageIO.write(image.creatImage(), "jpeg", response.getOutputStream());
%>

结果运行以后filter中如下这行报错:        chain.doFilter(request, response);
错误信息为 getOutputStream() has already been called for this response

在网上搜索原因如下:

//关于采用文件流输出的方式处理:
//所有的%>后面不要换行,包括最后一个;
//因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
//而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制,
//就会发生:getOutputStream() has already been called for this response的错误
//详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270
//而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件
//下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。

最后修改jsp文件,去掉多余的空格解决了问题。当然,通过jsp处理这些问题还是不太好,还是通过servlet来输出图片是最好的解决方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics