【问题标题】:HttpServletResponse content type null when detecting html file检测html文件时HttpServletResponse内容类型为null
【发布时间】:2020-03-02 19:47:32
【问题描述】:

我正在尝试实现 Java servlet 过滤器,它会修改 html 响应。

我的过滤器类的doFilter 方法如下所示:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (filterConfig == null) {
        return;
    }

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    String contentType = res.getContentType();

    if (contentType != null && contentType.contains("text/html")) {
        chain.doFilter(req, res);
        // do some modification
    } 
}

对于每个响应,我都试图弄清楚它是否是 HTML。如果是这样,我做了一些修改,但是我有以下问题:在请求jsf文件时,res.getContentType()返回nullres.getHeader("Content-Type")也返回null)。在我的浏览器的开发工具中,我可以看到“Content-Type”标头的值为“text/html;”。 charset=UTF-8',但为什么res.getContentType() 在这种情况下返回null

还有其他方法可以检测过滤器中的 HTML 响应吗?

编辑我在 if 子句中添加了 chain.doFilter(req, res) 调用。

【问题讨论】:

  • @BalusC chain.doFilter(req, res) 被调用(参见编辑后的代码),但我认为它应该在 if 子句之前调用,对吧?
  • @ℛɑƒæĿ 请注意为什么...我正在尝试获取响应内容并对其进行修改,我需要请求内容做什么?

标签: java jsf content-type servlet-filters


【解决方案1】:

由于 JSF 使用 servlet,您只能检查它在链后生成的内容(您似乎期望它在您的过滤器之前执行,但事实并非如此)。原因是完整的过滤器链总是在 servlet 之前执行,总是,请参阅

这意味着在您的doFilter(...) 中,您只能在代码中的chain.doFilter(..) 之后访问响应,如第一个链接中所示。

因此,除非过滤器创建内容(它不应该 iirc,至少不是真实内容),响应中的内容类型将始终在 @ 之前为 null 987654328@ 被调用(除非过滤器例如创建了身份验证/授权失败响应)。

实际上你的代码正在做

String a=null;
if (a != null || or a.equals("b") {
   doThing();
}

因此,您似乎拥有http://www.xyproblem.info,因此您必须重新考虑您的设计。 (你想达到什么目的)

【讨论】:

  • 感谢您的解释。我在res.getContentType() 之前移动了chain.doFilter(...),它可以工作。
猜你喜欢
  • 1970-01-01
  • 2014-08-21
  • 2011-12-02
  • 2020-02-24
  • 2012-08-08
  • 2010-12-17
  • 2020-08-06
  • 2011-03-06
  • 2011-05-14
相关资源
最近更新 更多