Cookie 大小上限为 4KB; 一个服务器最多在客户端浏览器上保存 20 个 Cookie; 一个浏览器最多保存 300 个 Cookie;
当然上面的数据只是 HTTP 的 Cookie 规范,但在浏览器大战的今天,一些浏览器为了打败对手,为了展现自己的能力起见,可能对 Cookie 规范 "扩展" 了一些,例如每个 Cookie 的大小为 8KB,最多可保存 500 个 Cookie 等!但也不会出现把你硬盘占满的可能!
注意,不同浏览器之间是不共享 Cookie 的。也就是说在你使用 IE 访问服务器时,服务器会把 Cookie 发给 IE,然后由 IE 保存起来,当你在使用 FireFox 访问服务器时,不可能把 IE 保存的 Cookie 发送给服务器。
请求 A 时,会在请求中包含 a; 请求 B 时,会在请求中包含 a、b; 请求 C 时,会在请求中包含 a、c;
A 请求的 URL 包含了 "/cookietest",所以会在请求中包含路径为 "/cookietest" 的 Cookie; B 请求的 URL 包含了 "/cookietest",以及 "/cookietest/servlet",所以请求中包含路径为 "/cookietest" 和 "/cookietest/servlet" 两个 Cookie; C 请求的 URL 包含了 "/cookietest",以及 "/cookietest/jsp",所以请求中包含路径为 "/cookietest" 和 "/cookietest/jsp" 两个 Cookie;
当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号 (Session),我的钱是保存在银行的账号中,而我带走的是我的卡号 (sessionId)。
当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!
当首次使用 session 时,服务器端要创建 session,session 是保存在服务器端,而给客户端的 session 的 id(一个 cookie 中保存了 sessionId)。客户端带走的是 sessionId,而数据是保存在 session 中。
当客户端再次访问服务器时,在请求中会带上 sessionId,而服务器会通过 sessionId 找到对应的 session,而无需再创建新的 session。
session 保存在服务器,而 sessionId 通过 Cookie 发送给客户端,但这个 Cookie 的生命不 - 1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个 Cookie 就丢失了。
当用户再次打开浏览器访问服务器时,就不会有 sessionId 发送给服务器,那么服务器会认为你没有 session,所以服务器会创建一个 session,并在响应中把 sessionId 中到 Cookie 中发送给客户端。
你可能会说,那原来的 session 对象会怎样?当一个 session 长时间没人使用的话,服务器会把 session 删除了!这个时长在 Tomcat 中配置是 30 分钟,可以在 ${CATALANA}/conf/web.xml 找到这个配置,当然你也可以在自己的 web.xml 中覆盖这个配置!
session 失效时间也说明一个问题!如果你打开网站的一个页面开始长时间不动,超出了 30 分钟后,再去点击链接或提交表单时你会发现,你的 session 已经丢失了!
String getId():获取 sessionId; int getMaxInactiveInterval():获取 session 可以的最大不活动时间(秒),默认为 30 分钟。当 session 在 30 分钟内没有使用,那么 Tomcat 会在 session 池中移除这个 session; void setMaxInactiveInterval(int interval):设置 session 允许的最大不活动时间(秒),如果设置为 1 秒,那么只要 session 在 1 秒内不被使用,那么 session 就会被移除; long getCreationTime():返回 session 的创建时间,返回值为当前时间的毫秒值; long getLastAccessedTime():返回 session 的最后活动时间,返回值为当前时间的毫秒值; void invalidate():让 session 失效!调用这个方法会被 session 失效,当 session 失效后,客户端再次请求,服务器会给客户端创建一个新的 session,并在响应中给客户端新 session 的 sessionId; boolean isNew():查看 session 是否为新。当客户端第一次请求时,服务器为客户端创建 session,但这时服务器还没有响应客户端,也就是还没有把 sessionId 响应给客户端时,这时 session 的状态为新。
我们知道 session 依赖 Cookie,那么 session 为什么依赖 Cookie 呢?因为服务器需要在每次请求中获取 sessionId,然后找到客户端的 session 对象。那么如果客户端浏览器关闭了 Cookie 呢?那么 session 是不是就会不存在了呢?
其实还有一种方法让服务器收到的每个请求中都带有 sessioinId,那就是 URL 重写!在每个页面中的每个链接和表单中都添加名为 jSessionId 的参数,值为当前 sessionid。当用户点击链接或提交表单时也服务器可以通过获取 jSessionId 这个参数来得到客户端的 sessionId,找到 sessoin 对象。
在 index.jsp 中配置:
- <body>
- <h1>URL重写</h1>
- <a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' >主页</a>
- <form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post">
- <input type="submit" value="提交"/>
- </form>
- </body>
也可以使用 response.encodeURL() 对每个请求的 URL 处理,这个方法会自动追加 jsessionid 参数,与上面我们手动添加是一样的效果。
- <a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主页</a>
- <form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">
- <input type="submit" value="提交"/>
- </form>
使用 response.encodeURL() 更加" 智能 ",它会判断客户端浏览器是否禁用了 Cookie,如果禁用了,那么这个方法在 URL 后面追加 jsessionid,否则不会追加。
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗
考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
5、所以个人建议:
将登陆信息等重要信息存放为 SESSION
其他信息如果需要保留,可以放在 COOKIE 中
来源: http://www.2cto.com/kf/201708/666450.html