有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案