【发布时间】: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