服务器如何识别客户端的会话cookie而不将其存储在服务器上

时间:2016-10-17 08:53:03

标签: session playframework session-cookies playframework-2.3 session-state-server

我试图理解,无状态Web应用程序中的会话管理机制究竟是如何工作的。目前我正在使用Play Framework,但我认为所有无状态Web框架的机制应该是相同的

这来自play框架的文档:(link

  

了解Session和Flash数据不是由服务器存储,而是使用cookie机制添加到每个后续HTTP请求中,这一点很重要

  

当然,cookie值是使用密钥签名的,因此客户端无法修改cookie数据(或者它将被无效)。

现在我的问题是,如果服务器没有保存会话ID的任何内容,它如何验证来自客户端的会话?!

我做了很多搜索,但我无法找到,服务器端的会话管理是如何工作的。

1 个答案:

答案 0 :(得分:2)

  

现在我的问题是,如果服务器没有保存关于a的任何内容   会话ID,它如何验证来自客户端的会话?

它的作用是通过一个键(它是您在application.conf中设置的application.secret)来标记您的会话数据并生成一个字母数字数据。然后它将数据和加密数据附加到cookie并将其发回

加密数据= 5d9857e8a41f94ecb2e4e957cd3ab4f263cfbdea

DATA = userEmail=sil@st.com&userName=silentprogrammer

如果您在正在运行的应用程序的浏览器中检查cookie(右键单击浏览器 - >检查元素 - >应用程序 - > Cookie->您的URL),您可以看到类似

的内容
"5d9857e8a41f94ecb2e4e957cd3ab4f263cfbdea-userEmail=sil@st.com&userName=silentprogrammer"

对于每个请求,它获取数据部分(userEmail=sil@st.com&userName=silentprogrammer)再次从KEY签署数据,并检查来自请求的字母数字数据,即5d9857e8a41f94ecb2e4e957cd3ab4f263cfbdea,如果两者相等(如果数据和加密密钥相同)会话被确认,否则会话到期。您可以通过在浏览器中更改cookie的数据部分并再次发送请求来确认这一点。

这就是我所观察到的