一,Cookie
Cookie是客户端存储数据的一种机制,浏览器中的数据来自服务器,但是在程序运行过程中也是有一些数据需要在浏览器这边存储,并在下次访问时再发给服务器,比如说,上次访问时间,用户身份信息,累计访问次数....这些临时数据都存储在浏览器。
但是为什么不把这些数据存储在本地文件中呢?这是因为浏览器考虑到安全性,禁止网页直接访问你电脑中的文件系统,造成你自身用户数据的泄露。为了保证安全性,又能进行数据存储,所以引入了Cookie(实际上也是按照硬盘文件的方式存储,但是浏览器把操作文件给封装了,网页只能往Cookie中存储键值对,也就是字符串)。
- Cookie往往是从服务器返回的数据(也可以是网页自己生成的)
- Cookie存储到浏览器所在的主机的硬盘上,并且按照域名来存储(每一个域名多可以存自己当Cookie,彼此之间互不影响)
- Cookie是按照键值对(key : value)的形式来组织的,这里的键值对是程序员自定义的,后续再请求这个服务器的时候,就会把 Cookie中内容自动昂带入到请求中,发给服务器,服务器通过 Cookie的内容做一些逻辑上的处理。
二,Session(会话)
Session是服务器存储数据的一种机制,它和cookie一样是使用键值对(sessionId : session)来存储存数据,session通常是与cookie一起使用,举个例子:用户登录
- 在用户第一次访问服务器时,服务器会根据用户提供的信息生成session(比如 name : 'zhangsan',password : '123456')和 sessionId,然后服务器会把sessionId返回给客户端(浏览器),客户端接收到这个sessionId后,将其保存在cookie中,同时cookie记录此sessionId属于哪个域名。
- 用户再次访问服务器时,请求会自动判断此域名下是否有cookie信息,如果存在cookie,则将cookie发送给服务器,服务器通过cookie拿到sessionId,然后根据sessionId查询session信息,如果能找到session信息,则可以执行后面的操作,如果没有则说明没有登录或者登录已经失效。
画个图理解一下:
三,Cookie 和 Session 的区别
存储位置不同:cookie保存在客户端浏览器,session保存在服务器端;
存取方式不同:cookie只能保存ASCII,session能保存任意数据类型;
有效期不同:cookie中的数据可以长时间存在,session中的数据在会话结束或者浏览器关闭时失效;
数据安全性不同:因为cookie是保存在浏览器中的,数据安全性相对较差;session是存储在服务器端的,安全性相对较高;
存储大小不同:cookie一般保存的数据大小不会超过4K;而session理论上来说没有限制;
Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合。完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是 sessionId;Session 中的 sessionId 也不需要非得通过 Cookie 传递.
四,使用 Cookie 和 Session 的方法
HttpServletRequest类
方法 | 描述 |
HttpSession getSession() | 从服务器中获取会话,参数为 true,则不存在会话时创建新的会话;参数为 false,不存在会话时不创建会话,默认是true |
Cookie[] getCookies()
|
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象,会自动把 Cookie 中的格式解析成键值对.
|
HttpServletResponse类
方法 | 描述 |
void addCookie(Cookie cookie)
|
把指定的 cookie 添加到响应中
|
HttpSession类
方法 | 描述 |
Object getAttribute(String name)
|
该方法返回在该 session 会话中具有指定名称的对象,如果没有
指定名称的对象,则返回 null
|
void setAttribute(String
name, Object value)
|
该方法使用指定的名称绑定一个对象到该 session 会话
|
Cookie类
方法 | 描述 |
String getName() |
该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 Set-Cooke 字段设置给浏览器的)
|
String getValue() |
该方法获取与 cookie 关联的值
|
void setValue(String newValue) |
该方法设置与 cookie 关联的值
|