【问题标题】:Jersey JAX-RS ContainerResponseFilter sets response code to 200 regardless of ResponseBuilder.statusJersey JAX-RS ContainerResponseFilter 将响应代码设置为 200,而不管 ResponseBuilder.status
【发布时间】:2021-09-23 19:58:32
【问题描述】:

我编写了一个实现 ContainerRequestFilter 和 ContainerResponseFilter 的类。在请求过滤器中,有一个身份验证检查,如果失败,则使用 ResponseBuilder 构建 401 响应。

当我从客户端检查 HTTP 响应代码时(我已经使用浏览器调试器和 SoapUI 进行了测试),它是 200 而不是 401。但响应正文是我设置的内容。我的调试日志和 Jersey 响应 LoggerFeature 都报告状态码是 401。它令人困惑。

日志:

[2021-07-14 15:57:45.974][TRACE][] - [Entering filter response]
[2021-07-14 15:57:45.975][TRACE][] - [Response context org.glassfish.jersey.server.ContainerResponse@62e8911f]
[2021-07-14 15:57:45.976][TRACE][] - [Response status info 401 Unauthorized]
[2021-07-14 15:57:45.977][DEBUG][o.g.jersey.logging.LoggingFeature] - [4 * Server
 responded with a response on thread http-nio-8180-exec-7
4 < 401
4 < Cache-Control: no-cache, no-store, no-transform
4 < Content-Encoding: ISO-8859-1
]

ResponseBuilder 代码:

ResponseBuilder rb = Response
    .status(Statuses.from(response.getStatus(), "TheStatus"))
    .entity(response.getBodyContent())
    .encoding(response.getCharacterEncoding())
    .cacheControl(CC);

for (Cookie c : response.getCookies())
    rb = rb.cookie(CookieConverter.toJaxRsNewCookie(c));

OutboundJaxrsResponse actualResponse = (OutboundJaxrsResponse) rb.build();
logger.trace("Actual response {}", actualResponse);
logger.trace("Status {}", actualResponse.getStatus());
logger.trace("Context {}", requestContext);
logger.trace("ResponseBuilder {}", rb);
requestContext.abortWith(actualResponse);

SoapUI(和浏览器/调试器)显示它接收到的内容如下:

HTTP/1.1 200 
Set-Cookie: GWCHALLENGE=YES; Domain=.sand.idfconnect.lan; Path=/; HttpOnly
WWW-Authenticate: Basic realm="rm-gw"
Content-Length: 190
Date: Wed, 14 Jul 2021 19:57:45 GMT
Keep-Alive: timeout=20
Connection: keep-alive

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>401: Access Denied</TITLE>
</HEAD>
<BODY>
<h1>401: Access Denied</h1>
<br>
</BODY>
</HTML>

我一定是遗漏了一些东西......我已经尝试过 Jersey 2.29 到 2.33,同样的区别。

非常感谢任何帮助!

【问题讨论】:

  • 我需要看一个完整的例子来测试它。

标签: jax-rs jersey-2.0


【解决方案1】:

根本原因是过滤器背后的特定服务在设置状态代码之前为响应正文编写了 HTML,这是错误的。一旦将某些内容写入响应正文,就无法更改状态代码。

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2011-10-18
    • 1970-01-01
    相关资源
    最近更新 更多