【问题标题】:Sniffy filter setup together with encoding filter?嗅探过滤器设置与编码过滤器一起?
【发布时间】:2016-10-04 01:10:27
【问题描述】:

我正在尝试将 Sniffy 分析器添加到 JSF 项目中。

根据documentation web.xml 需要使用以下过滤器进行更新:

<filter>
    <filter-name>sniffer</filter-name>
    <filter-class>io.sniffy.servlet.SnifferFilter</filter-class>
    <init-param>
        <param-name>inject-html</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>enabled</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>sniffer</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但是 web.xml 已经包含一个过滤器:

<filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>org.primefaces.titan.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>    
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

当嗅探器过滤器被添加(并且工作正常)字符编码过滤器停止工作(字符是乱码)。

web.xml 应该如何让两个过滤器都工作?

【问题讨论】:

  • 过滤器按照它们在 web.xml 中声明的顺序被调用。问题表明 Sniffy 过滤器在字符编码过滤器有机会设置请求编码之前访问请求有效负载。逻辑解决方案是将字符编码过滤器的映射放在 Sniffy 过滤器之前。
  • @BalusC 在嗅探器产生相同结果之前声明字符编码过滤器(字符是乱码)。在这种情况下,过滤器的顺序似乎没有区别。
  • 您能显示从您的服务器返回的 Content-Type 标头的值吗?你可以在浏览器的开发者工具中查看
  • @bedrin Content-Type 的值如下:Content-Type:"text/html;charset=UTF-8"

标签: servlets web.xml servlet-filters sniffy


【解决方案1】:

这里是嗅探开发者。它是 Sniffy 中的 bug - 我计划在即将发布的 3.1 版本中修复它。

作为一种解决方法,您可以在 JVM 参数中添加以下内容:

-Dfile.encoding=UTF-8

【讨论】:

  • 在 Payara 服务器上运行 Sniffy 时收到以下警告。这在跟踪问题时可能很有用。 Warning: Unable to set request character encoding to UTF-8 from context , because request parameters have already been read, or ServletRequest.getReader() has already been called
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2016-09-24
  • 2022-08-10
  • 2016-07-15
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多