我想弄清楚我可能在这里遗漏了什么。
我有一个 Servlet TestServlet,它是
Smalltalk defineClass: #TestServlet
superclass: #{VisualWave.HttpServlet}
indexedType: #none
private: false
instanceVariableNames: ''
classInstanceVariableNames: ''
imports: ''
category: ''
使用获取方法:
doGet: aRequest response: aResponse
aResponse write: aRequest session key
现在有了这个我运行一个工作区代码
client := HttpClient new.
Transcript
show: (client executeRequest: (HttpRequest
get: 'http://localhost:8008/servlet/TestServlet'))
value value;
cr.
Transcript
show: (client executeRequest: (HttpRequest
get: 'http://localhost:8008/servlet/TestServlet'))
value value;
cr.
Transcript
show: (client executeRequest: (HttpRequest
get: 'http://localhost:8008/servlet/TestServlet'))
value value;
cr.
Transcript
show: (client executeRequest: (HttpRequest
get: 'http://localhost:8008/servlet/TestServlet'))
value value;
cr
在这里,每个第三个请求都会成为一个不同的会话密钥。
当我调试时,我发现在方法 Response => setSessionKey
webRequest
中不会有一个名为 cookie cookieName
,所以它会设置 cookie。稍后在第二个请求webRequest
中有一个 cookie 名称,因此它不会设置 cookie。因此下一个(第三个)请求将启动一个新会话,并且由于它没有cookieName
in webRequest
,它将使用新的会话密钥设置 cookieName ,该密钥将保留在第四届也是。
这是预期的行为,所以我错过了什么吗?或者它可以以不同的方式完成,这样这种行为就不会发生?
setSessionKey
self session
ifNotNil:
[| cookieName |
cookieName := webRequest webSite sessionCookieName.
(webRequest cookieValueAt: cookieName)
ifNil: [self cookieAt: cookieName put: self session key]]
期待 smalltalk 大师在这里帮助我。
提前致谢。
PS:我知道我们可以将会话 cookie 设置为响应,但我正在寻找不同的解决方案,或者可能是更正确的解决方案。我也想知道发生这种情况的原因。谢谢。