【问题标题】:how can i do sessions in java if some one disables cookies in my browser?如果有人在我的浏览器中禁用 cookie,我如何在 java 中进行会话?
【发布时间】:2011-01-05 03:54:16
【问题描述】:

我想知道是否有人在我的浏览器中禁用了 cookie,然后 cookie 对我的浏览器不起作用,那么我如何在 java 中进行会话。我正在为服务器端编程编写 servlet。 那么我的会话如何工作?它是如何识别用户的?由于 JSESSION ID 存储在 cookie 中...

【问题讨论】:

  • 如一些答案所示,有多种方法。一个重要的问题是 - 它应该有多安全?如果它是一个博客,不是很。如果是银行业务,那就更多了。这确实会影响解决方案。
  • 没有各种方法。只有一种方法:编码/重写 URL 以包含(某种)会话 ID。没有其他方法。只要您不将 URL 泄露给其他人,它就足够安全了。对于银行业务,您始终可以根据 user-agent 和/或 remote-attr 标头再添加一张支票,并将其绑定到特定会话。
  • 我们还在依赖这些 URL 重写或 Cookie 技术吗?

标签: java jsp servlets cookies


【解决方案1】:

如果 cookie 被禁用,您仍然可以通过将 JSESSIONID 的值作为查询参数发送来维持会话,例如:

http://www.mywebsite.com/somePage?JSESSIONID=389729387392

请记住,如果安全是首要考虑因素,那么您可能不想使用这种方法,因为它会将会话 ID 直接放入 url。

【讨论】:

    【解决方案2】:

    如果 cookie 被禁用,大多数会话提供程序会附加一个名为 JSESSIONID 的 URL 参数来维护会话状态

    【讨论】:

      【解决方案3】:

      请参阅 HttpServletResponse encodeURL()encodeRedirectURL()

      如果浏览器不支持 cookie,这些函数将适当地重写您的 URL 以包含会话信息。根据您使用的 Java Web 框架,这些函数可能会被自动调用(只要您使用框架的方法来编写 URL)。

      请注意,这可能并非在所有情况下都可取,因为使会话 ID 在链接中可见会涉及安全和缓存问题。 This page 在短短的篇幅中比我能更好地总结问题,并提供了一种禁用此功能的方法。

      【讨论】:

        【解决方案4】:

        正如其他人所提到的,您的 servlet 容器,例如如果浏览器不允许 cookie,tomcat 会自动将 JSESSIONID 放在 url 中。它可以在 tomcat 中进行配置,正如您在 answer 中看到的那样。

        我的建议是您只需尝试一下。将您的 Web 应用程序保持原样,不做任何更改,然后在禁用 cookie 的浏览器中运行它,看看会发生什么。

        【讨论】:

        • 链接的答案是错误的。 cookies="false"永久禁用使用 cookie 来维护会话,并且它不会为每个请求自动重写 URL。它只会对普通的 GET 请求执行此操作(因此不适用于 POST 请求)。然后,您必须更改页面中的所有链接以包括 URL 重写。
        【解决方案5】:

        查看 JSP 页面的标准标记库,特别是 <c:url> 标记。

        http://onjava.com/pub/a/pub/a/onjava/2002/05/08/jstl.html?page=2

        我相信如果 cookie 不可用,它也会处理 jsession-id 属性。

        【讨论】:

          【解决方案6】:

          您需要将jsessionid 附加到您的Web 应用程序中涉及的所有应该由客户端 调用的URL。这包括重定向 URL 和 JSP 页面中的链接。

          如果是重定向网址,您需要先使用HttpServletResponse#encodeRedirectURL()

          response.sendRedirect(response.encodeRedirectURL("page.jsp"));
          

          如果是 JSP 页面中的链接,您基本上需要首先通过 HttpServletResponse#encodeURL() 传递这些 URL。您可以借助JSTL 的帮助来做到这一点(只需将jstl-1.2.jar 放入/WEB-INF<c:url> 标记,它将在幕后通过上述方法传递URL:

          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          ...
              <a href="<c:url value="page1.jsp" />">link1</a>
              <a href="<c:url value="page2.jsp" />">link2</a>
              ...
              <form action="<c:url value="servlet" />" method="post">
                  ...
              </form>
          

          【讨论】:

            【解决方案7】:

            作为参考,很高兴知道 html5 引入了 sessionStorage 作为 Web Storage 的一部分。 24ways.org上有一篇好文章介绍它:Breaking Out The Edges of The Browser

            支持:

            • 最新:Internet Explorer、Firefox、Safari(桌面和移动/iPhone)
            • 部分:谷歌浏览器(仅支持localStorage
            • 不支持:Opera(自 10.10 起)

            HTML5 (including next generation additions still in development)

            【讨论】:

            【解决方案8】:

            其他答案很棒;我不需要重复。但我确实有一些额外的 cmets。

            请不要将会话数据(整个会话)放入 cookie,而仅将会话 ID 放入可能已散列的会话 ID。人们编辑 cookie 的内容太容易了。将会话数据留在服务器上;如果您有很多并发用户或会话寿命很长,则可能在数据库中。

            如果会话 id 本身非常宝贵,您甚至可以将其放在 POST 参数中,从而防止它出现在 URL 本身中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-12-20
              • 1970-01-01
              • 2020-12-24
              • 2020-06-21
              • 2021-05-27
              • 1970-01-01
              • 2014-09-09
              相关资源
              最近更新 更多