我感觉八股文里面 Javaweb 问的其实不算多,我在面试的时候被问过 cookie 和 session,其他的就没问了,哦,还问了一下 servlet,感觉问来问去也就是这几个问的多一点。而对于cookie和session的回答,我答的不算太好,所以写一篇文章来重新梳理一下这个知识点。
假如你登录一个网站,你输入了用户名密码后,点击登录。这时候服务器拿到了你的用户名密码,首先会把它们放到数据库当中,然后服务器就会产生一个 cookie,这个 cookie 会携带着你的用户名密码发送给浏览器,浏览器会保存这个 cookie。你登录成功后,会弹出一个问你是否保存用户名密码的东西,你同意了,那下次你登录就不用输用户名密码了,浏览器将 cookie 传给服务器就行了(cookie 里面有你的用户名密码)。但现在问题来了,假如有人入侵你的电脑,看到了你浏览器里面的cookie,你 cookie 又有用户名密码,那你岂不是毁了?所以为了保证安全,我们引入了 session 这个概念。session 中文意思就是会话,我们还是用刚刚那个例子。你登录的时候,服务器拿到了你的用户名密码,然后将用户名密码保存到数据库后,服务器会根据用户名密码生成一个 sessionid,这个 sessionid 用来唯一标识你的用户名密码。这个 sessionid 是一个无规律的字符串。然后服务器建立一个 cookie ,将 sessionid 放入 cookie 中,传给浏览器,浏览器保存这个 cookie。等下次登录时,将这个 cookie 传给服务器,服务器看到 cookie 里面的 sessionid 后,会看看这个 sessionid 有没有对应的用户名密码,假如有那你就登录成功了。用了 sessionid 的话,即使你的电脑被黑了也没关系,黑客最多会看到你的 cookie 里面有一个 sessionid,他们看到的这个 sessionid 是一个无规律的字符串,所以根本不会知道你的用户名密码。