在 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());
}
}
我使用 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());
}
}