在每个请求的 PreProcessInterceptor 中获得新的 Http Session

New Http Session obtained in PreProcessInterceptor on every Request

我有一个实现了 PreProcessInterceptor.

的拦截器

我需要在 preProcess 方法中获取 HttpSession 对象,所以我使用:

@Context
private HttpServletRequest httpRequest;

然后:

 httpRequest.getSession();

获取 HttpSession 对象。

起初我认为一切正常,但后来我意识到 httpRequest.getSession() 在每次请求时返回一个新的 HttpSession 对象。

我需要在用户第一次请求时设置一些会话属性,然后在以后的请求中使用这些属性。属性设置正确,我什至可以沿着同一个请求堆栈向下访问这些属性。但是,由于我对每个新请求都获得一个新会话,因此我无法访问这些属性。

我是否需要从客户端发送一些东西来做我的 REST 服务,比如令牌之类的东西?

这是我的拦截器的更完整视图

@Provider
@ServerInterceptor
@SecurityPrecedence
public class SecurityInterceptor implements PreProcessInterceptor, AcceptedByMethod {
    ...
    @Context
    private HttpServletRequest httpRequest;

    @Override
    public boolean accept(Class classe, Method metodo) {
        return metodo.getAnnotation(PermitAll.class) == null;
    }

    ...

    @Override
    public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod) {

        HttpSession httpSession = httpRequest.getSession();
        // Set attributes on httpSession
        ...

        return null;
    }
}

Session尝试HTTP Cookies的概念。

第一个 HTTP 请求的处理会检测到没有当前 Session 并创建一个新请求。每当响应返回给客户端时,Session ID 就会被填充为 Cookie(Http 响应 Header)。

如果您的第二个 HTTP 请求对同一个 Cookie 有一个请求 Header,则不会创建新的 httpSession。

因此,每当您向服务器发送请求时,请检查服务器中是否存在 Cookie,并在每次请求时发送该 cookie。