我知道在处理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/