有人能告诉我如何在Dropwizard 0.8.x或更高版本中实现会话管理吗。到目前为止,我一直在使用Dropwizard 0.7.0,并在其中完美地工作。但当我迁移到0.8.x时,我真的被提供的更改文档弄糊涂了。
在Dropwizard 0.7.0(我以前使用过)中,它是像下面的一样完成的
/*MainApplication.class session handler */
environment.jersey().register(HttpSessionProvider.class);
environment.servlets().setSessionHandler(new SessionHandler());
/*Resource.class session check*/
HttpSession session = httpServletRequest.getSession(true);
但它似乎已经不起作用了,确切地说HttpSessionProvider.class不存在,并被其他一些实现所取代。
如果有人向我们展示一下这是怎么回事,那将是非常有帮助的。谢谢
这对您不起作用的原因是您需要在响应中设置cookie。我在研究dropwizard应用程序的启用会话状态时注意到了这一点,在该应用程序中,底层cookie在Jetty Response对象上创建,但它从未进入Jersey Response对象,因此被丢弃。
为了解决这个问题,我所做的是实现一个Filter,它从Jetty中提取"Set Cookie"信息,并将其放在出站响应对象上。
String cookie = HttpConnection.
getCurrentConnection()
.getHttpChannel()
.getResponse()
.getHttpFields().get(HttpHeader.SET_COOKIE.asString());
if (LOG.isDebugEnabled()) {
LOG.debug("Adding session cookie to response for subsequent requests {}", cookie);
}
httpServletResponse.addHeader(HttpHeader.SET_COOKIE.asString(), cookie);
@Yashwanth Krishnan
我知道这是旧的,但我注意到会话不是从一个URL维护到另一个URL的,只需在初始化应用程序时添加这段代码,会话处理主要是一个容器,而不是DropWizard特有的。
SessionHandler sessionHandler = new SessionHandler();
sessionHandler.getSessionManager().setMaxInactiveInterval(SOME_NUMBER);
/**
* By default the session manager tracks sessions by URL and Cookies, we
* want to track by cookies only since
* we are doing a validation on all the app not URL by URL.
*/
sessionHandler.getSessionManager().setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));
environment.servlets().setSessionHandler(sessionHandler);