Cookie
- :因为HTTP协议无状态的协议,不会记录用户上次访问的状态。服务器并不知道,多次请求是同一个浏览器发送的,还是多个不同的用户发送的。
因此出现了两种会话技术:- 浏览器客户端的技术:Cookie
- 服务器端的技术:Session
3.Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,实际上Cookie是服务器在本地机器上存储的一小段文本,并随着每次请求发送到服务器。
Cookie技术通过请求和响应报文中写入Cookie信息来控制客户端的状态。
Cookie会根据响应报文里的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie。
每个Cookie只能保存一个键和值,键和值都是字符串类型。不同于Map,一个Map可以保存多个键和值的。如果要保存多个键和值,使用多个Cookie对象。
每个网站的Cookie都会以一个文本文件的方式放在一个目录下,每个Cookie的大小不超过4K
访问流程
-
浏览器第1次访问服务器的时候,浏览器端没有Cookie,由服务器端创建Cookie对象
2.以一个响应头Set-Cookie: 键=值 的方式发送给浏览器
- 浏览器接收到服务器发送回来的Cookie,保存在本地硬盘中。
4. 下次浏览器再访问服务器的时候,浏览器会将Cookie的信息发送给服务器,以Cookie的请求头发送。
5. 服务器就可以接收到Cookie的信息
注:在Tomcat8中cookie值中不能使用分号(?、逗号(,)、等号(=)以及空格,可以直接使用汉字。
- 浏览器接收到服务器发送回来的Cookie,保存在本地硬盘中。
关于cookie的一些方法
Cookie类的方法 | 作用 |
---|---|
Cookie(String name,String value) | 通过构造方法创建一个Cookie对象,参数:键,值 |
addCookie(Cookie cookie) | 将创建好的Cookie对象发送给浏览器,参数:cookie对象 |
void setMaxAge(int expiry) | 设置Cookie过期的时间,单位是秒,负值表示cookie不是持久存储的,当Web浏览器退出时将被删除。零值导致cookie马上被删除。,为正数表示秒。 |
Cookie[] getCookies() | 获取浏览器发送回来的所有的Cookie 如果浏览器端没有Cookie信息,得到null |
String getName() | 得到Cookie的键 |
String getValue() | 得到Cookie的值 |
java.net.URLEncode.encode(“字符串”,utf-8) | 当使用一些特殊字符是,应该使用URl编码 |
java.net.URLDEcode.Decode(“字符串”,utf-8) | 使用URl解码 |
Session
概念:服务器端会话技术
- 也是键值对的存储格式,底层是Map结构
- 键是String类型,值是Object。
- Session是会话对象,也称为会话域。
- 数据保存在服务器的内存中
创建会话的时机:第一次访问,并且由服务器调用了getSession()方法,就会创建一个会话。
以后每次访问服务器,浏览器会自动带上会话ID(密码条),服务器就可以通过会话ID来识别不同的用户。由Tomcat实现接口,并且实例化对象
访问流程
- 浏览器第1次访问,没有会话。
- 由服务器getSession()方法创建会话,生成一个会话的ID
- 使用Cookie将会话ID发送给浏览器,相当于把密码条给了用户。
- 下次再访问,浏览器会读取Cookie中信息,再发送给服务器。把会话id再发送给了服务器。
- 服务器得到会话ID,从服务器内存中去找相应的ID,得到用户的会话域。
结论:会话ID是通过Cookie在浏览器与服务器之间进行传输的
HttpServletRequest创建会话的方法 | 描述 |
---|---|
HttpSession request.getSession() | 得到一个会话对象 如果是第一次访问,创建一个新的会话 如果服务器中已经有自己的会话,返回之前已经存在的会话。 |
会话接口中的方法
HttpSession接口方法 | 作用 |
---|---|
String getId() | 得到会话的ID,每个用户ID是不同的。格式:32位的十六进制数 |
long getCreationTime() | 得到会话创建的时间,返回long类型。1970-1-1加上long的值得到的时间 |
boolean isNew() | 判断这个会话是否是新的,新的返回true |
修改会话过期时间的三种方式
- 会话默认存在的时间是30分钟,如果设置为0或负数表示会话不过期。
session中的方法 | 说明 |
---|---|
int getMaxInactiveInterval() | 查看会话过期的时间 |
时间间隔的含义:在这个时间内,如果没有访问服务器,过期了。如果访问了一次服务器,则重新计时。
一:通过代码
session.setMaxInactiveInterval(10);
二:可以通过web.xml的配置来实现
<!--配置会话过期的时间-->
<session-config>
<!--单位是分钟-->
<session-timeout>5</session-timeout>
</session-config>
三:立刻失效
调用一个方法:session.invalidate() 让服务器上的会话马上删除
这个方法通常用在用户退出的代码中
注意:如果代码和xml同时使用,以代码为主,就近原则。代码时间为秒,xml时间单位为分钟。
Session和Cookie的主要区别
- Cookie
- 一个Cookie只能保存一个键和值
- 键和值只能是字符串类型
- 保存在浏览器端硬盘中
- Session
- 一个会话可以保存多个键和值
- 会话中键是String,值是Object
- 保存在服务器的内存中