1

这是我的情况,我有一个网站,我只是使用 Apache HTTPD 加载,然后向仅返回 JSON 数据的 servlet 发出 Ajax POST 请求。然后使用该 JSON 数据更新表等。

现在我想将用户逻辑添加到我的站点,并为单个用户提出的请求维护 servlet 会话。

我知道 servlet 需要返回第一次调用 request.getSession() 生成的会话 id,以便客户端可以将此 sessionid 添加到未来的 Ajax 请求中,以便 servlet 知道要使用内存中的哪个会话。

我还了解可以将此会话 ID 返回给客户端的两种方式是使用 cookie (JESSIONID) 或 URL 重写。

如果我不能使用 URL 重写,因为我只是返回 JSON 数据,那么 cookie 是我将会话 ID 发送回客户端的唯一方法吗?

另外,作为一个附带问题,目前我注意到我的任何来自 servlet 的 HTTP 响应中都没有 JSESSIONID cookie。有人向我建议,这是 Tomcat7 中的新功能,我必须在全局 context.xml 中激活它们。这是否意味着默认情况下即使您调用 request.getSession() 也没有会话处理?

4

1 回答 1

0

您已正确识别出 Tomcat 支持的三种处理会话 ID 的方法中的两种。还有第三种方法可以跟踪会话,但前提是应用程序通过 SSL 运行。在这种情况下,您可以将 Tomcat 配置为使用 SSL 会话 ID。

如果 Servlet 调用 request.getSession() 则 Tomcat 总是在响应中包含会话 ID。但是,这些 cookie 在 Tomcat 7 及更高版本中默认标记为 httpOnly,这意味着它们对 javascript 不可见(以防止试图窃取 cookie 的 XSS 攻击)。如果会话 cookie 需要对脚本可见,那么您需要在 Web 应用程序的 context.xml 中设置 useHttpOnly="false"(仅更改该文件的默认值)或在 $CATALINA_BASE/conf/context.xml 中进行更改每个 Web 应用程序的默认设置。

于 2013-10-10T09:41:27.560 回答