我正在基于Web服务的Tomcat应用程序上工作,该应用程序专门执行JAX-RS类型的RESTful API。有一个由标头确定的授权概念。根据一个人扮演的角色,他们或多或少会看到某些东西,但是通常他们会看到至少一部分东西。例如,有一项提供类别列表的服务。几乎每个人都可以访问它,但不是每个人都可以看到所有类别。有一种方法可以执行数据库调用来获取用户有权查看的内容,但是大约需要200毫秒。我想做一次并将其存储在某种会话中。但是,这又是JAXRS,我以前认为状态无法保持。我可以只进行一次权利检查,将结果对象存储在HttpSession中吗?我需要对Tomcat / OpenShift和其他人员进行任何维护吗?我不认为会话在OpenShift负载均衡器上的位置之间跳转。
我看到了这样的代码:
@Provider
public class AuthenticationFilter implements javax.ws.rs.container.ContainerRequestFilter
...
private static final String AUTHORIZATION_PROPERTY = "Authorization";
private static final String AUTHENTICATION_SCHEME = "Basic"
但是我不知道这是否适用于所有JAX-RS类型的情况。现在,我什至不知道部署了什么样的授权方案。
我不是在寻找完整的答案,而是一个有用的起点和避免的地方。如果某些东西在部署时不起作用,我将不会有太多的错误余地,特别是对于产品。
在我在(Wildfly / RestEasy)中测试的环境中,这可以正常工作。我也有一个ContainerRequestFilter
,它创建一个自定义的主体。在服务代码中,我使用@RolesAllowed
。但是,使用普通的ContainerRequestFilter
时,我看到响应没有设置Cookie,并且当我再次返回另一个请求时,我必须再次通过filter
方法。因此,就您而言,在这种情况下,您完全是无国籍的。
但是,如果我添加:
@Context
private HttpServletRequest httpServletRequest;
到我的ContainerRequestFilter
,并在我的filter
方法中访问会话ID,我可以看到响应现在具有JSESSIONID cookie。重复调用Cookie会给我相同的HttpSession
。在我的服务中,我向方法中添加了@Context HttpServletRequest request
,从而可以访问会话和更具状态性的内容。
我将它留给REST哲学家来决定,现在使用有状态代码是否是一个好主意,但是,只要您使用的客户端正确处理Cookie,您就可以计算用户在[C0 ]方法(首先检查会话以查看它们是否已经存在),然后使用您的JAX-RS方法访问它们。