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

honchy 2013-12-09 09:42:29
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 ServletException, IOException {
// 在内存中创建图象
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.
...全文
712 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_34367820 2016-05-19
  • 打赏
  • 举报
回复
引用 22 楼 tinyspace 的回复:
我也碰到了这个问题,用如下方式解决: 发送如下Header参数,就不会请求两次。 Content-Type: image/jpeg Last-Modified: Wed, 02 Sep 2015 13:48:53 GMT Content-Length: 3625 代码如下: ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", bos); byte [] buf = bos.toByteArray(); response.setContentType("image/jpeg"); response.setContentLength(buf.length); long modelLastModifiedDate=System.currentTimeMillis()-86400; //最后更新时间要比当前时间早才行,反正请求的时候带随机数,所以这个时间无所谓 response.addDateHeader("Last-Modified",modelLastModifiedDate); ServletOutputStream sos = response.getOutputStream(); sos.write(buf); bos.close(); sos.close();
这个管用,能解决问题
JiangP_ 2015-11-12
  • 打赏
  • 举报
回复
我也遇到了,发现的规律是,连续快速点击两次,会请求3次,第一次的sessionid和后面两次的sessionid不一样。但是还没发现原因 
JiangP_ 2015-11-12
  • 打赏
  • 举报
回复
引用 12 楼 蜗牛-的回复:
[quote=引用 11 楼 huxiweng 的回复:] 代码层面没问题,用其他浏览器试试看看。 还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因[/quote]
引用 11 楼 huxiweng 的回复:
代码层面没问题,用其他浏览器试试看看。 还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因[/quote] 我最近也遇到了,发现的规律是,连续快速点击两次,会请求3次,第一次的sessionid和后面两次的sessionid不一样。但是还没发现原因 
tinyspace 2015-09-02
  • 打赏
  • 举报
回复
我也碰到了这个问题,用如下方式解决: 发送如下Header参数,就不会请求两次。 Content-Type: image/jpeg Last-Modified: Wed, 02 Sep 2015 13:48:53 GMT Content-Length: 3625 代码如下: ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", bos); byte [] buf = bos.toByteArray(); response.setContentType("image/jpeg"); response.setContentLength(buf.length); long modelLastModifiedDate=System.currentTimeMillis()-86400; //最后更新时间要比当前时间早才行,反正请求的时候带随机数,所以这个时间无所谓 response.addDateHeader("Last-Modified",modelLastModifiedDate); ServletOutputStream sos = response.getOutputStream(); sos.write(buf); bos.close(); sos.close();
只是_曾经 2015-07-06
  • 打赏
  • 举报
回复
不好意思,我也挖个坟。今天调试验证码也遇到火狐请求两次问题。挺坑人的。
musen365 2014-09-03
  • 打赏
  • 举报
回复
我刚也遇到过,是插件的问题,禁用了一些插件后,重启Firefox,问题解决了
littleant 2014-07-31
  • 打赏
  • 举报
回复
这个问题在3年遇到两次,个人认为就是火狐浏览器的问题
honchy 2013-12-12
  • 打赏
  • 举报
回复
引用 16 楼 fangmingshijie 的回复:
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();
貌似这样也会又问题。呵呵。
末日哥 2013-12-11
  • 打赏
  • 举报
回复
不太清楚,我记得之前好像也有人出现过这个问题
  • 打赏
  • 举报
回复
你就当浏览器bug吧。还好只是针对图片。要不然在网易宝里面充钱每次提交两次money就会翻番了。。
teemai 2013-12-11
  • 打赏
  • 举报
回复
引用 12 楼 magi1201 的回复:
[quote=引用 11 楼 huxiweng 的回复:] 代码层面没问题,用其他浏览器试试看看。 还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因[/quote] 插件问题
姜小白- 2013-12-11
  • 打赏
  • 举报
回复
引用 11 楼 huxiweng 的回复:
代码层面没问题,用其他浏览器试试看看。 还有就是把firefox的插件全部禁用试试
其它浏览器都没问题,火狐试10次,有8次都是走两次doGet,没有找到规律。但是向页面响应却是有一次,想不明白原因
teemai 2013-12-11
  • 打赏
  • 举报
回复
代码层面没问题,用其他浏览器试试看看。 还有就是把firefox的插件全部禁用试试
姜小白- 2013-12-11
  • 打赏
  • 举报
回复
过来顶一下,希望有大牛过来解释下这个现象。
zark 2013-12-11
  • 打赏
  • 举报
回复
引用 14 楼 ch656409110 的回复:
你就当浏览器bug吧。还好只是针对图片。要不然在网易宝里面充钱每次提交两次money就会翻番了。。
扣钱也会扣翻翻
  • 打赏
  • 举报
回复
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();
honchy 2013-12-10
  • 打赏
  • 举报
回复
引用 8 楼 ch656409110 的回复:
en ,我也遇到过,如果是通过页面引用该servlet就不会出现调用两次的现象。。
我猜测可能是浏览器在处理这个图片的时候,做了什么多余的动作。这个里面的道理我就猜不出了。
  • 打赏
  • 举报
回复
en ,我也遇到过,如果是通过页面引用该servlet就不会出现调用两次的现象。。
姜小白- 2013-12-09
  • 打赏
  • 举报
回复
是有时候火狐会走两次doGet()方法,但也只生成一个验证码出来

想了一会儿,还没想到一个合理的解释的方法。
honchy 2013-12-09
  • 打赏
  • 举报
回复
补充下,servlet的配置为 /ImageServlet
加载更多回复(5)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧