非2xx HTTP代码的Servlet响应过滤器

3
我想在我的服务器上向HTTP响应添加一些头文件。无论返回的代码(2xx、4xx、5xx),我都需要添加这些头文件。我尝试使用javax.servlet.Filter@WebFilter注解以及javax.ws.rs.container.ContainerResponseFilter@Provider注解来实现,但是当应用程序返回200个HTTP状态代码时,只有doFilterfilter方法被调用。是否可能将过滤器用于非2xx响应?
我正在使用Wildfly 8.2.0作为应用程序服务器,但我认为这并不重要。
编辑:
我认为我应该提供更多关于我的问题的信息。我的应用程序是由Resteasy实现的REST服务。我还通过使用Wildlfy安全子系统配置了授权的安全策略。我需要REST服务的响应始终包含CORS标头,以便对每个前端请求进行回应,即使客户端未通过授权检查。但是当响应代码为401时,过滤器方法不会被调用,即使我使用DispatcherType.ERROR,如@Steve C所建议。
因此,我不返回任何状态代码,所有代码都由服务器返回(正如@ACV所说)。也许这就是导致过滤器不适用于我的情况的原因。
编辑II:
我在这个问题中找到了部分答案。通过在Wildfly standalone.xml中配置Undertow子系统,可以将标头添加到所有非错误(非5xx)响应中。

1
我猜你需要实现某种JASPIC包装器来捕获那个401错误。过去我注意到大多数(但不是全部)Java EE实现根本不会通过过滤器链传递与身份验证相关的请求(包括那些针对j_security_check的请求)。或者,使用Undertow阀门也可能解决问题。 - Steve C
谢谢,可以通过在Undertow子系统中使用过滤器来捕获401。我已经更新了问题。 - Vladislav Koroteev
3个回答

3

您需要在@WebFilter声明中包含DispatcherType

@WebFilter(urlPatterns={...}, dispatcherTypes={ERROR, REQUEST, ...})
public class ...

我测试了一下,它实际上并不起作用(WildFly 10)。我想知道为什么会被接受。我和 OP 有相同的情况,我将 DispatcherType 的所有值都添加到了 dispatcherTypes 数组中,但是过滤器仍然没有对 401s 起作用。我想知道为什么 JBoss 是这样实现的。但是他们已经获得了认证,所以这一定是按照规范来的。 - Stijn de Witt

0
尝试实现一个标准的Servlet过滤器。顺便说一下,404错误是来自服务器而不是您的应用程序。还有500错误。您可以自己返回这些代码,在这种情况下,过滤器应该起作用。另外,另一个解决方案是在任何请求之前设置头文件。但这并不能解决404问题。 如何设置Servlet过滤器

但是401来自安全子系统...那么你如何在那里实现它?标准过滤器不会对容器中的401触发。 - Stijn de Witt
@StijndeWitt,按照上面的建议,请参考这个指南:https://dev59.com/VYXca4cB1Zd3GeqPK50m - ACV
请阅读我的评论... 这个答案并没有回答问题。链接的教程是通用的servlet过滤器(但它们不会触发,这正是问题所在),而您提到的SO问题只提供了一半的解决方案。只要您的标题有一个静态配置,并且只有一个域,您就可以摆脱它。 - Stijn de Witt

0

我认为你应该通过在web.xml中声明错误页面来捕获错误:

<!--
The error-page element contains a mapping between an error code
or exception type to the path of a resource in the web application
-->
<error-page>

    <!--
    The error-code contains an HTTP error code, ex: 404
    -->
    <error-code></error-code>

    <!--
    The location element contains the location of the resource in the web
    application relative to the root of the web application. The value of
    the location must have a leading `/'.
    -->
    <location>/my.jsp</location>
</error-page>

...然后编写my.jsp来处理错误响应(我一直使用JSP进行异常处理;我不知道servlet URI是否同样适用)。

唯一的缺点是,您必须明确地为每个要处理的HTTP错误包含一个节点。

请参见http://docs.oracle.com/cd/E14571_01/web.1111/e13712/web_xml.htm#WBAPP537


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接