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)
我怀疑问题是由于你的使用HttpServletResponse.flushBuffer().
作为HttpServletRequest州的API :
强制将缓冲区中的任何内容写入客户端.对此方法的调用会自动提交响应,这意味着将写入状态代码和标头.
我的假设是,Spring会尝试在控制器上的方法返回后设置Content-Type标头HttpServletResponse.但是,由于您已通过调用提交了响应HttpServletResponse.flushBuffer(),因此无法执行此操作.
我会尝试:
HttpServletResponse.flushBuffer()HttpServletRequest.flushBuffer()由于您将内容直接写入输出流,因此无需使用@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)
| 归档时间: |
|
| 查看次数: |
2442 次 |
| 最近记录: |