什么时候饼干比会话更好?

时间:2011-07-08 14:47:00

标签: servlets cookies

public class ServletDemo extends HttpServlet{

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

        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

        Cookie cookie = new Cookie("url","mkyong dot com");
        cookie.setMaxAge(60*60); //1 hour
        response.addCookie(cookie);

        pw.println("Cookies created");
    }
}

我正在看Java Stack概念。 cookie上有很多东西,当需要在客户端存储小数据时使用它。

但是请你告诉我,我们什么时候应该准确地使用Cookies?

当饼干比会话更好?

3 个答案:

答案 0 :(得分:2)

这一系列设计决策的一部分与我们在系统中涉及多台计算机时需要保留状态信息的位置有关。

当你说“session”时,我怀疑你的意思是servlet容器将为你管理的HttpSession。实际上很可能HttpSession实际上是通过使用cookie来维护的:cookie只是拥有会话表的某种键。

这种将一些减少的数据量传递回浏览器并让服务器跟踪主要内容的模式也很常见。有时人们会使用全部三种:比如说小东西的cookie,HttpSession作为方便的缓存,以及他们真正关心的东西的数据库。

有很多因素需要考虑,这里有几个:

  • 在cookie中发送多少数据是合理的,过多的事情会变慢。
  • 这有多安全?服务器通常会收集用户在此会话中输入的更多数据,如果我们将其发送回cookie中的浏览器,我们对于哪些敏感信息无法被劫持或读取有多大信心?
  • 我们选择的会话机制有多可靠?丢失浏览器,失去我们即将购买的5k假期预订?丢失服务器上的HttpSession?也许是同样的结果? (某些应用服务器具有会话复制功能,但这是一种开销)。

就个人而言,我发现通常HttpSession API非常方便,我从不选择使用cookie。我的经验法则是“如果它很容易重新创建,请将其保留在HttpSession中,否则请确保它存在于数据库中,必要时创建专门用于状态管理的数据库(并且不要忘记该数据库的内务管理)。

可重新创建的东西的例子:从数据库中检索的项目(我们总是可以再次获取它们),用户不介意重新输入的内容(比如一些搜索条件)。不可重新创建的示例:17页已完成的保险申请表。

答案 1 :(得分:1)

Cookie不如会话安全。

会话由服务器完全控制。在这两种情况下,客户端都需要安全地呈现真实的会话数据,但使用cookie时,有更多的机会可以隐藏内部发生的事情。 cookie偷窃的后果通常比盗窃不透明的会话ID更糟糕。

由于服务器没有设置会话数据库等,因此可以更快地开发Cookie,但如果您关心设计,它们将是一种质量较低的解决方案。

答案 2 :(得分:1)

要回答您的具体问题,当Cookie可以执行您无法使用会话执行的操作时,Cookie会优先于会话。我认为有两个理由可以使用它们:

  • 当您需要有关客户端的一些信息时,即使用户关闭了浏览器,此信息也必须在多个客户端会话中保持存在。例如,自动登录使用cookie:在客户会话的第一次请求时,cookie被发送,因此网站能够识别用户。
  • 当您需要在多个Web应用程序之间的信息之间共享某些信息时,只要它们都来自同一个域。例如,单点登录可以使用cookie。第一个应用程序验证用户并设置一个令牌cookie,该cookie被发送到第二个应用程序。然后,第二个应用程序可以使用此cookie自动验证用户身份。