【问题标题】:Servlet session without cookies + ajax requests that only return JSON没有 cookie 的 Servlet 会话 + 仅返回 JSON 的 ajax 请求
【发布时间】:2013-10-17 11:33:40
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java ajax session servlets tomcat7


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢,确实还有 SSL 方法,但我没有考虑它,因为我们目前不使用 HTTPS,尽管我们确实谈到了将来获得证书。好的,所以我想现在我别无选择,只能使用 cookie。即使使用 useHttpOnly="false" 我仍然看不到它们,所以我可能仍然做错了什么,我会进一步调查。谢谢。
    猜你喜欢
    • 2012-11-01
    • 2015-11-08
    • 2018-08-21
    • 2013-04-23
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多