【问题标题】:How to initialise a session in Play如何在 Play 中初始化会话
【发布时间】:2014-12-29 20:38:15
【问题描述】:

嗯,这是来自一个新使用 Play 的开发者。当谈到使用会话时,我发现它根本不像我在 servlet 或 jsps 中所做的那样。 我尝试阅读文档并发现 Play 中的会话存储在 HTTP cookie 中。我尝试过导入 HTTP 类的游戏。 然而,我的问题是我无法初始化一个新会话以在其中设置值。 我显然已经尝试过在 Java 中使用“新”会话,但显然没有成功。

Session session = new session();

在看过我用过的地方之后:

Session session = Http.Context.current().session();

这表明我在识别上下文和当前时出错

我尝试在网上查看示例代码和代码。然而,它们中的每一个都是不同的,我不知道在 Play 中使用会话的基本方法,因此之后我可以使用 put 和 get 来保存和检索。

我知道这个问题似乎太基本了,但相信我,在任何地方都没有我需要的确切答案。所以请帮我解决这个问题。 任何答案、任何代码或任何链接都将受到高度赞赏。

【问题讨论】:

标签: java http session playframework-2.0


【解决方案1】:

在使用 Play 的会话时,忘掉 jsp 和 servlet 世界中有关会话的一切。 Play 不会在服务器端存储任何内容,并且按照设计它是完全无状态的。 Play 会话只是附加到每个 http 请求的 cookie,它存储在客户端。在您的情况下,“会话”一词可能会产生误导。

使用会话非常简单。您所需要的一切都是从 play.mvc.Controller 继承的,您在创建自己的控制器时必须对其进行扩展。要将值放入其中,您只需从控制器中调用 session(String key, String value) 方法。例如:

public class Application extends Controller {
  public static Result login() {
    session("key", "example value");
    return ok("Welcome!");
  }
}

如果客户端没有存储会话 cookie,此方法将创建一个新的并将其附加到 HTTP 响应中。否则它将修改现有的。

要读取存储值使用:

String value = session("key");

您还可以从会话中删除值:

session().remove("key");

或完全摧毁它:

session().clear();

在 Play 的术语中,这些是与特定 cookie 女巫一起工作的辅助方法,称为 session。没有什么能阻止您创建另一个具有类似目的的 cookie。但这需要更多的写作。这些辅助方法可以节省您的时间,而且在许多情况下绰绰有余。

您可以通过设置 session.cookieName 属性在 application.conf 中指定会话 cookie 名称。

【讨论】:

  • 非常感谢@Daniel Olszewski 的回复。这真的很有帮助。 :)
  • ..但正如你所说,直接调用会话方法没有用。我有一个扩展 play.mvc.controller 的控制器。当我按照您的建议拨打会议电话时。我看到以下错误: MyController 类型的方法 session(String, String) 未定义。你能建议出什么问题吗?
  • 请发布您的代码的相关部分。这将有助于调查发生了什么。
  • 好吧,正如我所说,我只是想与 PLAY 一起工作。但下面仍然是我的代码片段。 public static String customerWarning(int cust) { String resp=null; Logger.info("Application : customerCodeWarning ++"); if(cust==3){ session("warning", "You don't have access to log in this module."); } else{ Application app= new Application(); resp=app.fetchData(); } return resp; }
  • 抱歉格式化..我不知道如何在 cmets 中发布代码。使用``并没有多大帮助。我希望你能抽出时间好好阅读它。正如我在这段代码中使用的那样,Eclipse 在使用会话时给了我错误。但是,此代码来自扩展 Controller 的类。
【解决方案2】:

在 play 2.8 中,Http.Context 已被弃用。这意味着,除其他外,方法“session()”在控制器中不再可用。

这是更新的做法:

public Result info(Http.Request request) {
    //This is the equivalent to the old session()
    request.session() ... 
}

Http.Request 需要通过 routes 中定义的路由向下传递。更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2015-11-18
    • 2013-10-14
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多