【问题标题】:Session management in Dropwizard 0.8.xDropwizard 0.8.x 中的会话管理
【发布时间】:2016-03-17 12:00:18
【问题描述】:

谁能告诉我如何在 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 不存在并被其他一些实现所取代。

如果有人向您展示这将是什么,这将是非常有帮助的。 谢谢。

【问题讨论】:

  • 嘿,你有没有尝试将会话注入到你的资源方法中?例如。在我的应用程序中我这样做:方法签名中的@Context HttpServletRequest。这肯定有效,然后您可以从您的请求对象中获取 HttpSession。您可能能够将会话直接注入您的资源方法中。
  • @pandaadb :我在这里使用了“@Context”,但在请求之间没有维护会话。有什么奇怪的。我们还需要像旧版本那样注册任何会话提供程序吗?
  • 我不必注册一个,我也从未详细研究过会话中的内容。但是保持会话,这不会发生在客户端吗?例如。服务器只是得到它得到的东西。 HttpSessionProvider 中的代码除了在请求本身上调用 get 之外什么都不做。在更高版本的 dropwizard 中,提供程序被替换为我认为 SessionFactoryProvider

标签: java session jersey dropwizard httpsession


【解决方案1】:

这对您不起作用的原因是您需要在响应中设置 cookie。我在为 dropwizard 应用程序启用会话状态时注意到了这一点,其中底层 cookie 在 Jetty Response 对象上创建,但它从未进入 Jersey Response 对象并因此被丢弃。

我为解决此问题所做的工作是实现一个过滤器,该过滤器从 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);

【讨论】:

    【解决方案2】:

    @Yashwanth 克里希南

    我知道这是旧的,但我注意到会话不是从一个 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);
    

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 2015-02-25
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2010-10-29
      • 2018-08-27
      • 2017-05-21
      相关资源
      最近更新 更多