java对ContainerRequestContext的并发调用#abortWith(..)挂起服务器
我有一个JAX-RS过滤器,它使用ContainerRequestContext#abortWith(..)
来表示授权失败:
@Priority(Priorities.AUTHORIZATION)
public class RequirePrincipalFilter implements ContainerRequestFilter {
private static final Logger LOG = LoggerFactory
.getLogger(RequirePrincipalFilter.class);
@Override
public void filter(final ContainerRequestContext requestContext)
throws IOException {
if (requestContext.getSecurityContext() == null
|| requestContext.getSecurityContext().getUserPrincipal() == null) {
LOG.debug("No Principal");
requestContext.abortWith(Response
.status(Status.UNAUTHORIZED)
.entity(new ErrorRepresentation(Status.UNAUTHORIZED
.getStatusCode(), "Authorization required"))
.header("WWW-Authenticate", "Bearer").build());
LOG.debug("Request Aborted");
}
}
}
当连续请求被调用abortWith(..)
时,
没问题。但是,当提出两个或两个以上此类请求时
同时,服务发散,因此不会返回响应
和
连接被挂起。对任何服务器的任何进一步请求
种类--通过过滤器授权、未授权,甚至请求
完全绕过该过滤器——也会导致连接挂起而没有响应
对所有适用的abortWith(..)
调用这两个日志语句
调用。i、 e.代码没有挂起在方法调用上
本身
我的问题是:我是否正确地使用了abortWith(..)
工具?
我怀疑这是我自己的错误,否则我会认为是我自己的错误
找到了其他有麻烦的人
我使用Jersey 2.17从Grizzly2 HTTP容器运行它,JVM是 Oracle JSE 1.8.0_45。我还尝试用JDK容器替换Grizzly容器。问题是一样的
作为一个实验,我尝试将调用序列化到abortWith(..)
通过使用静态日志作为监视器从同步块中调用它。即使调用被序列化,问题仍然存在
共 (0) 个答案