1

我正在尝试直接从 Cookie 请求标头中挖掘到我之前通过以下方式存储在 Play 会话中的值

Http.Context.current().session().put("my-fancy-key", "some-interesting-value");

我只能访问 play.mvc.Http.Request ,从中我可以访问 play.mvc.Http.Cookie ...但从那里我绊倒了。

这个片段不起作用......提示?

注意:我完全愿意使用不在 Play 框架中的对象。我看到 Netty 有 cookie r/w 函数,并且正在研究那些……也许是直接在 javax 中的东西?

String playSessionCookieName = Configuration.root().getString("session.cookieName", "PLAY_SESSION");

Http.Cookie playSessionCookie = r.cookie(playSessionCookieName);

if (playSessionCookie != null) {
   // FIXME: What to do here to get my value?

   Logger.debug("Found the cookie! Serialized value: " + playSessionCookie.value());
   try {
      ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(playSessionCookie.value().getBytes()));
      Http.Session session = (Http.Session) objIn.readObject();

      // Here's the goal
      Logger.debug("Found my value: " + session.get("my-fancy-key"));

   } catch (Exception e) {
      Logger.warn("Couldn't deserialize the value.", e);
   }
}
4

3 回答 3

2

我不知道为什么你不使用 simplesession(key)来获取会话值,但是如果你需要从会话 cookie 中获取会话值,你可以使用类似的东西(玩 2.0)。

String cookieVal = request().cookies().get("PLAY_SESSION").value();
cookieVal = cookieVal.substring(cookieVal.indexOf("-")+1);
for(String a: cookieVal.split("%00")) {
    String[] k = a.split("%3A");
    // k[0] - session key; k[1] - session value
    Logger.info(k[0] + " = " + k[1]);
}
于 2013-01-09T13:51:45.240 回答
0

Cookie 有一个方法 value()。我不知道它是否符合您的要求,但我会从那里开始。

于 2013-01-09T12:49:40.783 回答
0

如果您有权访问结果,则迭代存储在结果中的会话而不是 cookie 可能更容易:

Session resultSession = play.test.Helpers.session(result);

for (Entry<String, String> entry : resultSession.entrySet()) {
    System.out.println("key:" + entry.getKey() + " value:" + entry.getValue());
}
于 2014-02-10T12:53:44.900 回答