cookie
1.特点
1.浏览器保存少量数据
2.都是存文本数据
3.每次访问都会携带 cookie(请求头中)
2.服务器cookie类和浏览器cookie字符串的区别
1.浏览器的cookie是 "key=value;key=value"的文本
而服务器的cookie类是 一个 key,value的数据类型
所以,服务器获得浏览器的cookie要用cookie[]接收
服务器向浏览器发送cookie,也是浏览器cookie字符串拼接了一个“key=value”
3.服务器向浏览器发送 cookie的方式
1.response.addCookie(cookie)
1.好处:可以设置浏览器cookie字符串的 某一段“key=value”的生存时间
2.坏处:每次只能add一个 cookie段,当然可以多次调用这个api,达到添加多个cookie段的效果
2.response.setHeader("set-cookie","key=value;key=value");
1.好处:一次可以添加多个 cookie段
2.坏处:不能设置 cookie段的 生存时间
4.浏览器cookie的有效时间
1.默认:浏览器关闭,cookie字符串中的所有 cookie段都死亡
注意:会话,是指只要这个浏览器有了这个cookie,除非(把这个浏览器的所有页面(一个页面有多个窗口))
全部关闭,这个cookie才会消失
2.setMaxAge(int expiry):设置 cookie段的有效时间;秒为单位
1.expiry > 0 : 指定次cookie段 多少秒后 过期(跟浏览器是否关闭无关)
< 0 : 浏览器关闭 此 cookie段过期
= 0 : 此cookie段,马上失效(可以修改浏览器cookie段,使它立即失效)
5.这样更改 浏览器 cookie段的值
1.后台发送的 cookie段 的key 和浏览器 cookie字符串 的某个 cookie段的key相同,那么会覆盖这个cookie段的 value
6.一个服务器产生的cookie只能在该服务器下使用(cookie只会发送,从该服务器认识的cookie)
cookie的应用(免输入用户名登录,session也可以用,随便只要理解cookie和session了就行)
就是将,第一次登入的用户名,放在cookie中,并且设置cookie的 存活时间>0,并且久一点
这样即使浏览器关闭,cookie也还在,然后前端页面用cookie的值就好了
session(map)
1.特点:
1.服务器保存大量数据
2.第一次创建 session(req.getSession()),这一步其实有2步
1.创建session(map),它的作用域是 一个会话,就是不同请求也行,相当于整个tomcat
并且每个session有一个唯一标识 JESSIONID:会话 id ,JESSIONID = id
2.response.setHeader("set-cookie","JID=id")
3.获得session,req.getSesssion().其实有3步
1.req.getcookies(),然后遍历出 key=JID的cookie
2.key=JID的 cookie,String id = cookie.getValue()
3.拿这个id,和后台的 多个session 的id去比较,找到相同的那个
4.这就证明,每一个session的 唯一标识 都不会相同
2.session的生命周期(session的超时指的是客户端2次请求的最大时间间隔)
1.cookie失效
这样就再也找不到,对应的 session了
2.session失效
1.默认超时时间是 30分钟
2.setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位)
1.interval > 0 : 设定 Session 的超时时长。
2.interval < 0 : 永不超时(极少使用)
3.getMaxInactiveInterval()获取 Session 的超时时间
invalidate() 让当前 Session 会话马上超时无效。
3.修改 session的 value(他就是map,map.setAttribute(相同的key,不同的value))
4.session的作用域,是会话级别,即只要这个请求的cookie符合该session就行
session是作用域整个服务,一个cookie带着sessionId,req.getSession() 就可以获得对应sessionId的session
令牌机制(session的应用),分三步(有2块令牌,session的令牌只能用一次,可以解决重复提交等问题,前提是令牌得自己规定好)
1.第一次 访问后台,session先获得并保存令牌
session.setAttribute("token",token)
2.浏览器携带 令牌,去访问后台
1.若 浏览器的令牌 和 session的令牌一样
1.处理请求
2.session更改 这个令牌
session.setAttribute("token",随便更改一个)
2.else 拒绝处理请求
3.当 浏览器再次 带着相同的令牌(表单重复提交),此时两块令牌已经不同了,后面也不会相同,拒绝处理请求