Dropwizard 0.8.x中的会话管理

时间:2015-12-11 14:27:44

标签: java session jersey dropwizard httpsession

有人可以告诉我如何在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不存在并被其他一些实现取代。

如果有人知道改变了什么将是非常有帮助的。 感谢。

2 个答案:

答案 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);