【问题标题】:Disabling Cookies stops Session as well?禁用 Cookies 也会停止会话吗?
【发布时间】:2015-10-04 10:53:10
【问题描述】:

我一直在构建一个 Web 应用程序,到目前为止我已经实现了登录和注册。用户可以注册,然后可以在 Web 应用程序中登录。一切正常。我正在做的是当用户单击Login 按钮时,正在调用一个servlet,我正在检查凭据是否正确,如果验证,则将isLoggedIn 保存在HttpSession 中并将其重定向到Home Page

LoginServlet.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    boolean isValidated = false;
    ... // Service Layer is invoked here and checks for user validation

    // Assume isValidated to be true
    if(isValidated){
        HttpSession session = request.getSession();
        session.setAttribute("isLoggedIn", Boolean.valueOf(true));
        ...
        // redirected to /home
    }else{
        // redirected to /login?invalid
    }
}

HomeController.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

    HttpSession session = request.getSession();
    Boolean isLoggedIn = (Boolean) session.getAttribute("isLoggedIn");
    if(isLoggedIn != null && isLoggedIn){
        ...
        // Service Layer is invoked to fetch `Home Page Data`
    }else{
        // redirected to /login?expired
    }
}

突然间我遇到了一个奇怪的问题,如果我使用 FireBug 禁用 localhost 的 cookie,我将无法再登录。无论我每次被重定向到/login?expired时是否输入正确的用户名或密码。

不明白,cookies是存储在client端,Session是存储在server端,那么为什么禁用cookies就不能设置session属性。

我已经尝试在 Spring-MVC 中为已经构建的 Web 应用程序禁用 Cookie,该应用程序正在生产中并且在那里也存在相同的问题。

【问题讨论】:

  • 除了通过 cookie 外,您希望如何跟踪会话?会话 ID 存储在 cookie 中。
  • 你的视图框架是什么?
  • 我正在使用简单的 servlet 和 jsp

标签: java session servlets cookies


【解决方案1】:

当我们使用HttpSession 机制管理会话时,jsessionid 会保存在浏览器的 cookie 中。因此,当您从浏览器中删除 cookie 或禁用 cookie 时,jsessionid 信息不会发送到服务器,而此时服务器会处理来自新会话的此请求。

【讨论】:

    【解决方案2】:

    会话是维护服务器和客户端之间的有状态对话。 默认情况下,Http 是一个无状态协议。 因此,为了使其成为有状态的对话,我们需要在浏览器端(cookie)存储一些值,这些值由浏览器随请求一起发送到服务器。 没有 cookie,每个请求都是一个新请求,它变成了无状态的对话。 这就是人们在禁用 cookie 时使用在 url (jsessionId) 中添加会话信息的原因。 要使用 URL 重写,请在您的 URL 上使用 response.encodeURL()

    【讨论】:

      【解决方案3】:

      启用 cookie 后,会话将存储在名为 JSESSIONID 的 cookie 中。

      如果禁用 cookie,容器应将会话 ID 重写为 GET 参数(即所有 URL 末尾的 &JSESSIONID=1223456fds)。

      如果默认情况下未启用 URL 重写,请参阅容器的文档以了解如何启用它。

      您可能需要考虑使用现代框架(例如带有 Thymeleaf 的 Spring MVC)来自动执行此操作。否则,您需要确保使用 response.encodeURL() 重写 URL,正如 Ouney 在他的回答中所指示的那样。

      【讨论】:

      • 默认情况下不会发生 URL 重写。您必须启用它。
      • @Ouney 这将取决于容器。
      • 不知道,但为了安全起见,我总是做 response.encodeURL()。
      • @Ouney 这听起来像是一种非常低级的方法,只有在编写 servlet 时才必须使用,就像我们在 90 年代所做的那样。对于像 Spring 这样的现代框架,这在最坏的情况下应该是一个配置问题。
      • 啊,但他实际上正在编写代码,就像它仍然是 90 年代的狂野(除了他至少不是从 servlet 编写 html)。
      【解决方案4】:

      每个请求和响应会话 id 存储在客户端作为 Cookie 由服务器检查,如果存在,则服务器更新信息,如果不存在则创建新会话。因此,当您在浏览器中禁用 cookie 时,每次请求都会创建一个新会话,因为 cookie 被禁用。

      有关更多信息,您可以参考此链接。 click here

      【讨论】:

        猜你喜欢
        • 2018-02-04
        • 1970-01-01
        • 2014-12-20
        • 2011-07-27
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        相关资源
        最近更新 更多