我将我们的一个网络服务从1.9更新到1.2.1,我们遇到的问题是图像不再按预期返回。
它们的mime类型为text/html
,响应很小,接近~150字节。浏览器当然会抱怨尝试将文本解释为图像而图像不会显示。
奇怪的是,HttpServletResponse在控制器功能结束时显然会在响应中显示真实数据。
这是控制器和将图像添加到响应中的功能,其中包含一些隐藏公司标识的更改:
@RequestMapping(value = "/lot/{someId}/{anotherId}/{width}", method = RequestMethod.GET)
public void getImage(@PathVariable Long someId, @PathVariable Integer anotherId, @PathVariable Integer width, HttpServletResponse response) throws IOException {
if(!validDimension(width)) { return; }
String key = someId+ "-" + anotherId+ "-" + width;
MyMap image = (MyMap) getFromCache(key);
if(image == null) {
image = someGetMapService.getMyMap(openHouseId, lotId);
MyMap processedImage = scaleMapImage(image, width);
if(processedImage != null) {
saveToCache(key, processedImage);
image = processedImage;//processedImage is valid so use that
}
}
processResponse(image.getMimeType(), image.getFile(), response);
}
processResponse代码:
private void processResponse(String mimeType, byte[] image, HttpServletResponse response) throws IOException {
ContentType contentType = ContentType.valueOfMimeType(mimeType, ContentType.findContentTypesByCategory(ContentTypeCategory.IMAGE));
//check for valid content type, and set it before streaming it out to avoid XSS vulnerabilities
//with things like svg - if not valid, don't stream out the image
if (contentType == null) {
LOG.log(Level.WARNING, MessageFormat.format("Unable to find matching content type for: {0}", mimeType));
response.flushBuffer();
return;
}
response.setContentType(contentType.getMimeType());
if (image != null) {
response.setContentLength(image.length);
response.getOutputStream().write(image);
}
response.flushBuffer();
}
我设置时解决了所有问题: spring.http.encoding.enabled = false
这在1.2发行说明中说明:
一致的HTTP URI /正文解码
现在,CharacterEncodingFilter会自动注册,以进行一致的URI /正文解码。如果您不需要UTF-8,可以使用spring.http.encoding.charset属性,或者如果您根本不想注册CharacterEncodingFilter,则可以将spring.http.encoding.enabled设置为false。
链接:Spring-Boot-1.2-Release-Notes
这是我的问题! 为什么那个过滤器会阻挡我的图像?