在 Grizzly 中配置会话 cookie 名称

Configure session cookie name in Grizzly

我使用 Grizzly 2.3.24 作为我的应用程序的独立网络服务器。由于 Grizzly-1798 已关闭,我想实现自己的 SessionManager。但似乎,我缺少设置默认会话 cookie 名称的配置选项。

有效的方法是在我获得会话之前设置所需的 cookie 名称,但这似乎有点疯狂,不是吗?

这里是一个在 Jersey 资源中访问会话的例子:

@GET
public Response testGetSession(@Context Request request) {
    request.setSessionCookieName("mySessionCookie");

    Session session = request.getSession();
    log.info("Got session id {}", session.getIdInternal());

    return Response.ok().entity("hallo").build();
}

如果我不指定request.setSessionCookieName(),它默认为JSESSIONID

我明白,可以在 RequestFilter 中针对所有请求执行此操作,但我真的需要走这条路吗?

我的期望是 SessionManager 将负责定义 cookie 名称。

经过一些研究,我认为这是一个错误。我已经提交 GRIZZLY-1877.


更新:

GRIZZLY-1877 已解决,版本 2.3.30 可供下载并在 maven central 中。

因此,不再需要下面的解决方法。只需实施 SessionManager#getSessionCookieName() 即可解决问题。


旧的解决方法:

与此同时(或者如果 v2.3.30 不是一个选项),我有一个解决方法,使用 Jersey 的 ContainerRequestFilter 为每个 Request 设置会话 cookie 名称:

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

/**
 * Until the session cookie can be defined in the Grizzly {@link HttpServer},
 * it will be set here.
 * <p>
 * The filter's priority ensures it gets executed before filters with 
 * {@link Priorities#AUTHENTICATION}.
 * 
 * @author hank
 */
@Provider
@Priority(300)  // less than 1000
@PreMatching
public class SessionCookieFilter implements ContainerRequestFilter {

    @Inject
    javax.inject.Provider<Request> requestProvider;

    @Inject
    Config config;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        Request request = requestProvider.get();
        request.setSessionCookieName(config.getSessionCookieName());
    }

}