当前位置: 代码迷 >> J2EE >> 火狐浏览器请求动态图片,能发出两次请求
  详细解决方案

火狐浏览器请求动态图片,能发出两次请求

热度:296   发布时间:2016-04-17 23:49:19.0
火狐浏览器请求动态图片,会发出两次请求
public class ImageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int I_WIDTH = 60;
private static int I_HEIGHT = 18;
private static Font VALIDATECODE_FONT = new Font("Times New Roman",
Font.PLAIN, 18);

public ImageServlet() {
super();
}

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletExceptionIOException {
// 在内存中创建图象
BufferedImage image = new BufferedImage(I_WIDTH, I_HEIGHT,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(Color.white);
g.fillRect(0, 0, I_WIDTH, I_HEIGHT);
// 画边框
g.setColor(Color.blue);
g.drawRect(0, 0, I_WIDTH - 1, I_HEIGHT - 1);
Long validate = new Long(10000 + Math.round((Math.random() * 90000)));
String validateCode = validate.toString();
request.getSession().setAttribute("validateCode", validateCode);
// 将认证码显示到图象中
g.setColor(Color.black);
g.setFont(VALIDATECODE_FONT);
// g.drawString(rand,10,15);
g.drawString(validateCode.toString(), 7, 15);
// 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
Random random = new Random();
for (int iIndex = 0; iIndex < 128; iIndex++) {
int x = random.nextInt(I_WIDTH);
int y = random.nextInt(I_HEIGHT);
g.drawLine(x, y, x, y);
}
// 图象生效
g.dispose();
// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
System.out.println("=============================================");
}
}


以上为servlet代码,通过浏览器直接访问:http://localhost:8080/struts2/ImageServlet
在火狐浏览器上,测试会发出两次请求。
求教是什么原理。

我所使用的测试版本为:火狐25.0.
------解决方案--------------------
是有时候火狐会走两次doGet()方法,但也只生成一个验证码出来

想了一会儿,还没想到一个合理的解释的方法。
------解决方案--------------------
en ,我也遇到过,如果是通过页面引用该servlet就不会出现调用两次的现象。。
------解决方案--------------------
引用:
代码层面没问题,用其他浏览器试试看看。
还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因
------解决方案--------------------
引用:
Quote: 引用:

代码层面没问题,用其他浏览器试试看看。
还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因

插件问题

------解决方案--------------------
 ImageIO.write(image, "JPEG", response.getOutputStream());我一般不会这样写。

我一般会这样写。

ServletOutputStream sos = response.getOutputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();  
ImageIO.write(image, "JPEG", bos);      
byte [] buf = bos.toByteArray();  
sos.write(buf);  
bos.close();  
sos.close(); 
  相关解决方案