Spring Boot 1.2升级中的一致URI /正文解码会破坏我们返回的图像

时间:2015-03-27 21:06:28

标签: java spring spring-mvc spring-boot

我将我们的一个网络服务从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

这是我的问题! 为什么那个过滤器会阻挡我的图像?

0 个答案:

没有答案