Java 不支持操作异常getUserPrincipal

Java 不支持操作异常getUserPrincipal,java,authentication,jersey,grizzly,Java,Authentication,Jersey,Grizzly,我已经创建了一个ContainerRequestfilter并成功地将其触发。 现在,我想在grizzly HttpServerProbe中访问我之前设置的UserPrincipal,如下所示: import com.sun.jersey.spi.container.ContainerRequest; @Override public ContainerRequest filter(ContainerRequest request) { Principal principal=req.ge

我已经创建了一个ContainerRequestfilter并成功地将其触发。 现在,我想在grizzly HttpServerProbe中访问我之前设置的UserPrincipal,如下所示:

import com.sun.jersey.spi.container.ContainerRequest;

@Override
public ContainerRequest filter(ContainerRequest request) {
  Principal principal=req.getUserPrincipal();
}
而是抛出一个“UnsupportedOperationException”。看起来ContainerRequest没有从修改的请求中提取UserPrincipal

修改通过以下方式完成:

import org.glassfish.grizzly.http.server.Request;

...

public void onRequestReceiveEvent(
  HttpServerFilter filter,Connection connection, Request request) {
  Principal principal=getPrincipalFromRequest(request);
  request.setUserPrincipal(principal);
}
问题是如何将主体信息从HttpServerProbe传输到 ContainerRequestFilter。org.glassfish.grizzly.http.server.Request具有安全性 信息(在本例中为SSL客户端证书信息),而com.sun.jersey.spi.container.ContainerRequest最初不提供该信息

不幸的是,我还没有找到在HttpServerProbe中设置SecurityContext的方法。在里面 ContainerRequestFilter我可以这样做,但必要的主要信息并不像我预期的那样可用

我使用的是泽西1.17和灰熊2.3.5

下面的链接都与这个问题有关,但没有一个提供线索 上述错误的原因可能是什么:

需要做什么才能访问主体/设置主体的安全上下文,以使HttpServerProbe和ContainerRequestFilter能够合作组装此信息?

Jersey/JAX-RS希望在您检索有关主体、用户角色等的任何信息之前进行设置。通常,在Jersey,这是由专门的人员完成的。请查看我们其中一个示例中的示例过滤器:

在此之后,您可以将
SecurityContext
(使用
@Context
)注入到您的资源或其他提供者(如过滤器)中。然后,您还可以调用
containerRequest.getUserPrincipal()
,而无需获得
UnsupportedOperationException

编辑1 如果需要在grizzly级别获取
主体
对象,可以将当前
请求
注入过滤器,然后在
过滤器
方法中检索值

@Context
private ThreadLocal<Request> request;
@Context
本地请求;

谢谢您的回复-我已经修改了问题以使其更清楚。如果我只能获取容器中已有的主体信息RequestFilteri现在通过创建一个PrincipalCache解决了这个问题,那么我很乐意设置SecurityContext—HttpUnitServerProbe会将主体按名称添加到缓存中,并将头信息添加到请求中。这样,ContainerRequestFilter就可以使用修改后的请求头中的信息从缓存中提取主体。在您提到的示例中,当缓存中没有主体信息时,也可以使用BasicAuth。