1. Cookie和Session
- 两者的区别
- cookie数据存放在客户端,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。
- 不同浏览器对cookie的数据大小限制不同,个数限制也不相同。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。
- 两者的联系:
- 都是用来记录用户的信息,以便让服务器分辨不同的用户。
- 可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。
1.1. Cookie简介
- 什么是 Cookie
- Cookie 是服务器通知客户端保存键值对的一种技术
- 客户端有了 Cookie 后,每次请求都会将其发送给服务器
- 每个 Cookie 的大小不能超过 4KB
- Cookie的基本概念 : 是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
- Cookie的类型 :
- Cookie总是由用户客户端进行保存的(一般是浏览器),按其存储位置可分为:内存式Cookie和硬盘式Cookie。
- 内存式Cookie存储在内存中,浏览器关闭后就会消失,由于其存储时间较短,因此也被称为非持久Cookie或会话Cookie。
- 硬盘式Cookie保存在硬盘中,不会随浏览器的关闭而消失,除非用户手工清理或到了过期时间。由于硬盘式Cookie存储时间是长期的,因此也被称为持久Cookie。
- Cookie的工作原理
- Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。
- 客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
![](https://img-blog.csdnimg.cn/img_convert/6e209427364c2ece90b699e56a75e575.png)
- Cookie属性 : 常用的是name与value
- Cookie的有效时间 : Cookie 是可以设置在浏览器的存活时间的。
- 通过 setMaxAge() 方法进行设置,具体说明:
-
- 正数:表示在指定的秒数后过期
- 负数:表示浏览器一关,Cookie 就会被删除(默认是-1)
- 零:表示马上删除 Cookie
- Cookie域名 : Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。
- 正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数。
1.2. Session简介
- 什么是Session :
- Session 就是一个接口(HttpSession)
- Session 就是会话,它是用来维护一个客户端和服务器之间关联的一种技术
- 每个客户端都有自己的一个 Session 会话
- Session 会话中,我们经常用来保存用户登录之后的信息
- Session的基本概念 :
- Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
- 如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
- Session工作原理 :
- 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session id
- 如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个)
- 如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id
-
- session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。
![](https://img-blog.csdnimg.cn/img_convert/fbf62b8cfb133fb743339e58d8deda67.png)
- Session的常用方法 :
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性
- Session失效时间
- Session的超时时间为
maxInactiveInterval
属性,可以通过对应的getMaxInactiveInterval()
获取,通过setMaxInactiveInterval(long interval)
修改。 - Session的
invalidate()
方法可以使Session失效。Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。Session的超时时间也可以在web.xml中修改。 - 注意:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。