Java Dropwizard 0.8.x中的会话管理

Java Dropwizard 0.8.x中的会话管理,java,session,jersey,dropwizard,httpsession,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); environ

有人能告诉我如何在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应用程序的启用会话状态时注意到了这一点,在dropwizard应用程序中,在Jetty响应对象上创建了底层cookie,但它从未进入Jersey响应对象,因此被丢弃

为了解决这个问题,我所做的是实现一个过滤器,该过滤器从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);
@亚什万·克里希南

我知道这很旧,但我注意到会话并没有从一个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);

嘿,你试过将会话注入你的资源方法吗?例如,在我的应用程序中,我在方法签名中执行:@Context-HttpServletRequest。这是肯定的,然后您可以从请求对象获取HttpSession。您可能可以将会话直接注入到资源方法中。@pandaadb:我在这里使用了'@Context',但在请求之间不会维护会话。有点奇怪。我们还需要注册任何会话提供者吗?就像在旧版本中一样?我不需要注册一个会话提供者,而且我从未详细研究过会话中的内容。但是维护会话,这不会发生在客户端吗?例如,服务器只得到它得到的东西。HttpSessionProvider中的代码只对请求本身调用get。在dropwizard的更高版本中,提供程序将被SessionFactoryProvider替换