response.setContentType() 在 Java 过滤器中重置 [英] response.setContentType() getting reset in Java Filter
问题描述
我试图在过滤器中将我的 gzipped 文件的内容类型设置为正确的 mime 类型,而不是 application/gzip.这是我的一些代码:
I'm trying to set the content type of my gzipped files to be of the correct mime type, rather than application/gzip, in a filter. Here's some of my code:
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
String reqUrl = request.getRequestURI();
if (reqUrl.endsWith(gzExt))
{
response.setHeader("Content-Encoding", "gzip");
response.setContentType("text/javascript");
System.out.println("Set header " +reqUrl +", " + response.getContentType() );
filterChain.doFilter(request, response);
System.out.println("Header now: " + reqUrl + ", " + response.getContentType() );
return;
}
}
输出:
Set header /test.js.gz, text/javascript
Header now: /test.js.gz, application/x-gzip
在浏览器中,我看到 content-encoding
已正确设置为 gzip
,但 content-type
仍为 应用程序/x-gzip
.似乎 filterChain.doFilter()
正在重置内容类型.
In the browser, I see that the content-encoding
is correctly set to gzip
, but the content-type
remains at application/x-gzip
. It seems that filterChain.doFilter()
is resetting the content type.
知道如何永久重置内容类型吗?
Any idea how to permanently reset the content type?
我没有任何其他过滤器.
I don't have any other filters.
推荐答案
我在这个答案的帮助下解决了这个问题:
I solved it with the help of this answer:
private class ForcableContentTypeWrapper extends HttpServletResponseWrapper
{
public ForcableContentTypeWrapper(HttpServletResponse response)
{
super(response);
}
@Override
public void setContentType(String type)
{
}
public void forceContentType(String type)
{
super.setContentType(type);
}
}
然后把我上面的代码改成:
Then changed my above code to:
if (reqUrl.endsWith(gzExt))
{
ForcableContentTypeWrapper newResponse = new ForcableContentTypeWrapper(response);
newResponse.setHeader("Content-Encoding", "gzip");
newResponse.forceContentType("text/javascript");
filterChain.doFilter(request, newResponse);
return;
}
这不是一个很好的解决方法,但它有效.
Its not a pretty workaround, but it works.
这篇关于response.setContentType() 在 Java 过滤器中重置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!