HTTP Accept标头使响应无效

时间:2017-03-21 14:49:16

标签: java http tomcat servlets

我正在尝试创建一个Java servlet,它将下载一个要在浏览器窗口中打开的文件(如果浏览器无法查看,则下载该文件)。例如,我正在尝试在浏览器中获取和查看PNG图像。

我尝试通过Fiddler发送没有标题的请求(Host: localhost除外),然后我找回了我要查找的图片。

当我尝试使用相同的URL在我的浏览器中查看图像时,我得到一个无效(透明)图像。我尝试将浏览器(Chrome)中的标题添加到Fiddler,当我添加以下标题时看起来它失败了:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

当我删除该标题或将其更改为Accept: */*时,图像会再次加载。我查看了Fiddler中的原始响应,发现发回的实际数据存在细微差别。

这就是我的servlet代码的样子。我没有手动检查Accept标头:

byte[] data = getData();

response.setContentType("image/png");
response.setHeader("Content-disposition", "inline; filename=\"my_image.png\"");
response.setContentLength(data.length);

OutputStream output = response.getOutputStream();
output.write(data);
output.close();

为什么Chrome的默认Accept标头使我的回复无法读取?如何让我的servlet忽略该标头并每次发回相同的数据?

修改

当我请求没有Accept标头的servlet时,这就是Fiddler在“Raw”视图中显示的内容(好):

HTTP/1.1 200 OK
x-xr-bookmark: ad70ff81-7415-4d46-954d-b79f98056729
content-disposition: inline; filename="image.PNG"
content-type: image/png
content-length: 82726
date: Tue, 21 Mar 2017 19:49:32 GMT
connection: close

 PNG


IHDR        5-   sRGB       gAMA    
 a      pHYs  t  t fx    IDATx^  {p\ }  &M $mg I  K;    N3    t`

*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

当我用上面提到的Accept标题请求它时,这就是Fiddler所显示的(不好):

HTTP/1.1 200 OK
x-xr-bookmark: 5a1b1e6d-6b68-42ac-a2cb-545811f9a879
content-disposition: inline; filename="image.PNG"
content-type: image/png
date: Tue, 21 Mar 2017 19:49:46 GMT
connection: close
Transfer-Encoding: chunked

258ec
 PNG


IHDR        5-   sRGB       gAMA    
 a      pHYs  t  t fx    IDATx^  {p\ }  &M $mg I  K;    N3 

*** FIDDLER: RawDisplay truncated at 128 characters. Right-click to disable truncation. ***

0 个答案:

没有答案