session - Playframework 2、Websocket 和 session

标签 session websocket playframework-2.0 session-cookies

我知道在处理websocket时,我不能使用session。 playframework 2 websocket 聊天示例将用户名添加到 url 中,但是如果我有一个已经登录的用户并且我不想通过 url 传递他的用户名,是否有另一种方法可以从内部获取用户登录凭据Websocket 请求?

这是我迄今为止尝试过的: 请求页面,我将从其中连接到套接字:

public static Result index(){
    session("username", "mike")
    return ok(indexpage.render());
}

这是 Websocket 部分:

public static Websocket<JsonNode> chat(){
    System.out.println(session("username"));    
    ....all the websocket stuff
}

我打印出来的所有内容都是空的 我做错了什么?

最佳答案

您可以访问 session :

package controllers

import play.api._
import play.api.mvc._
import play.api.libs.iteratee._

object Application extends Controller {
  def index = Action {
    Ok(views.html.index()).withSession("connected" -> "user@gmail.com")
  }

  //I used for views.html.index the html markup from http://www.websocket.org/echo.html
  def wstest = WebSocket.using[String] { request =>

    val in = Iteratee.consume[String]()

    val username = request.session.get("connected").getOrElse("missing username")

    val out = Enumerator("Hello " + username) //puts  Hello user@gmail.com on the screen

    (in, out)
  }
}

好的,现在介绍 Java( Controller 中的方法):

public static WebSocket<String> chat(){
    final Http.Session session = session();
    final String name = session("username");//better version

    return new WebSocket<String>() {
        public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
            in.onMessage(new F.Callback<String>() {
                public void invoke(String event) {
                    System.out.println(event);
                }
            });

            in.onClose(new F.Callback0() {
                public void invoke() {
                    System.out.println("Disconnected");
                }
            });

            out.write("Hello " + session.get("username"));
            out.write("Hello " + name);
        }
    };
}

您似乎无法在 WebSocket 创建中直接访问 http 上下文,但您可以将 session 或来自 Cookie 的更好数据存储在常量中,并在 WebSocket 实例创建中使用它。

我上传了一个带有测试的 Java 示例 https://github.com/schleichardt/stackoverflow-answers/tree/so12879547 (它不在主分支上)。

PS: 这在 WebSocket 创建中不起作用:

Http.Context.current().session().get("username")

关于session - Playframework 2、Websocket 和 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12879547/

相关文章:

jquery - ajax 调用中 session 过期时回发

php - 如何在 Laravel 4.2 中获取当前实例

websocket - SockJS 增加池大小

java - 如何使用 Play Framework 获取特定 Web 套接字端点上的 Actor 列表?

json - Scala Play 2 - 将 JsValue 转换为模型对象

c# - 同一应用内的服务看不到同一 session

具有共享首选项的 Android 登录/注册

c# - SignalR WebSocket 握手 : Sec-WebSocket-Accept header is missing

c# - 统一WebSocket4Net

java - postgresql:如何存储用户密码?