当前位置: 首页 > 面试题库 >

response.setContentType()在Java过滤器中重置

管景天
2023-03-14
问题内容

我试图在过滤器中将压缩文件的内容类型设置为正确的mime类型,而不是application / gzip。这是我的一些代码:

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仍为application/x-gzip。似乎filterChain.doFilter()正在重置内容类型。

知道如何永久重置内容类型吗?

我没有其他过滤器。


问题答案:

我借助以下答案解决了它:

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);
    }
}

然后将我上面的代码更改为:

    if (reqUrl.endsWith(gzExt))
    {
        ForcableContentTypeWrapper newResponse = new ForcableContentTypeWrapper(response);
        newResponse.setHeader("Content-Encoding", "gzip");
        newResponse.forceContentType("text/javascript");
        filterChain.doFilter(request, newResponse);
        return;
    }

它不是一个很好的解决方法,但它可以工作。



 类似资料:
  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在

  • 问题内容: 我正在尝试找到一种方法,可将请求从过滤器重定向到登录页面,但我不知道如何从servlet重定向。我搜索了,但发现的是方法。我在过滤器的响应对象上找不到此方法。是什么原因 我该如何解决? 问题答案: 在Filter中,响应是而不是。因此将强制转换为。 如果使用上下文路径: 也不要忘记在最后打电话。

  • 我所拥有的 预期产出 实际产量 这只是一个例子。在我的真实代码中,我正在对我的全局状态(useContext, useReduer)执行删除操作。 是一个ID数组。

  • 您好,我如何在Java8(我知道它已经在Java11)中做相反的不过滤这一点 我可以这样写 但很难读懂

  • 我有这个密码 但是,我有这样的错误消息: 怎么解决这个?

  • 问题内容: Servlet和Filter有什么区别?您建议使用什么来授权页面? 问题答案: 当你要根据特定条件过滤和/或修改请求时,请使用。使用时要控制,预处理和/或后处理请求。 在Java EE的教程中提到有关筛选如下: 筛选器是可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于,过滤器本身通常不会创建响应。相反,过滤器提供的功能可以“附加”到任何类型的Web资源。