response.setContentType() 在 Java 过滤器中重置 [英] response.setContentType() getting reset in Java Filter

查看:36
本文介绍了response.setContentType() 在 Java 过滤器中重置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在过滤器中将我的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆