有人可以告诉我如何在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不存在并被其他一些实现取代。
如果有人知道改变了什么将是非常有帮助的。 感谢。
答案 0 :(得分:0)
这不适合您的原因是您需要在响应中设置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);
答案 1 :(得分:0)
@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);