Dropwizard 0.8.x中的会话管理



有人能告诉我如何在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);

相关内容

  • 没有找到相关文章

最新更新