Spring MVC:返回CSS

Lud*_*ume 4 css java spring spring-mvc

我的目标是合并/缩小所有css文件并将结果作为String返回.

这是我的Spring测试方法:

@RequestMapping(value = "/stylesheet.css", method = RequestMethod.GET, produces = "text/css")
@ResponseBody
public void css(HttpServletResponse response) {
    File path = new File(servletContext.getRealPath("/WEB-INF/includes/css/"));

    File[] files = path.listFiles(...);

    for (File file : files) {
        InputStream is = new FileInputStream(file);
        IOUtils.copy(is, response.getOutputStream());
        response.flushBuffer();

        is.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于Chrome,Firefox和Safari,但不适用于IE和Opera.

在检查员中进行一些检查后,URL https://host/project/stylesheet.css将在每个浏览器中加载.我可以看到内容但似乎没有被认出来text/css.

此外,即使有produces = "text/css",我也无法content-type在所有浏览器中看到http标头.

IE中的错误日志:

CSS ignored because of mime type incompatibility
Run Code Online (Sandbox Code Playgroud)

有谁知道如何正确地做到这一点?

工作代码:

@RequestMapping(value = "/stylesheet.css", method = RequestMethod.GET)
public ResponseEntity<Void> css(HttpServletResponse response) {
    response.setContentType("text/css");

    File path = new File(servletContext.getRealPath("/WEB-INF/includes/css/"));

    File[] files = path.listFiles(...);

    for (File file : files) {
        InputStream is = new FileInputStream(file);
        IOUtils.copy(is, response.getOutputStream());
        IOUtils.closeQuietly(is);
    }

    response.flushBuffer();

    return new ResponseEntity<Void>(HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ake 6

我怀疑问题是由于你的使用HttpServletResponse.flushBuffer().

作为HttpServletRequest州的API :

强制将缓冲区中的任何内容写入客户端.对此方法的调用会自动提交响应,这意味着将写入状态代码和标头.

我的假设是,Spring会尝试在控制器上的方法返回后设置Content-Type标头HttpServletResponse.但是,由于您已通过调用提交了响应HttpServletResponse.flushBuffer(),因此无法执行此操作.

我会尝试:

  • 调用之前将HttpServletResponse注入控制器并在代码中自己设置头HttpServletResponse.flushBuffer()
  • 删除你的用法 HttpServletRequest.flushBuffer()


Wil*_*ing 6

由于您将内容直接写入输出流,因此无需使用@ResponseBody.您只需确保设置Content-Type响应标头.另外,最好返回一个ResponseEntity(而不是void)来向Spring表明你自己正在处理响应.

@RequestMapping(value = "/stylesheet.css", method = RequestMethod.GET)
public ResponseEntity css(HttpServletResponse response) {

    // Set the content-type
    response.setHeader("Content-Type", "text/css");

    File path = new File(servletContext.getRealPath("/WEB-INF/includes/css/"));

    File[] files = path.listFiles(...);

    for (File file : files) {
        InputStream is = new FileInputStream(file);
        IOUtils.copy(is, response.getOutputStream());
        IOUtils.closeQuietly(is);
    }

    response.flushBuffer();

    return new ResponseEntity(HttpStatus.OK)
}
Run Code Online (Sandbox Code Playgroud)