javaWeb之Cookie和Session
一、cookie
1.Cookie的简单示意图
2.Cookie的解说
- Cookie是服务器在客户端(浏览器端)保存用户的信息,比如登录名,浏览历史等,就可以以Cookie的方式保存。
- Cookie的数据量并不大,因此不能携带数据量大的文件,服务器端在需要的时候可以从客户端(浏览器端)读取保存在它本地的Cookie信息,是通过http协议
- Cookie数据是保存在浏览器的
3.Cookie的作用
- 保存上次登录时间等信息
- 保存用户名、密码,在一定时间不用重薪登录
- 网站的个性化,比如定制网络的服务、内容。
4.Cookie常用方法
cookie有点像一张表(key-value),分两列,一个是名字,一个是值,数据类型都是String数据类型。(可以理解为其内部维护了一个类似Map的容器)
如何创建一个Cookie(它在服务器端创建的,在浏览器端(客户端)保存的)
Cookie cookie = new Cookie(String name,String value);
如何将一个Cookie添加到客户端(浏览器端)
response.addCookie(Cookie cookie);
如何读取保存在浏览器端(客户端)本地的Cookie{在服务器端读取Cookie信息}
request.getCookies();//返回的是一个Cookie数组,因为浏览器端(客户端)可能通过http响应携带大量的Cookie信息,但是这些Cookie还在生命周期内或没有在删除
如何设置保存时间
cookie.setMaxAge();//[cookie]指定的Cookie对象
5.Cookie的生命周期
- Cookie的生命周期指的是如何管理Cookie什么时候被销毁(删除)
- 注意
- 如果你设置的设置的时间到了,也就意味着这个Cookie的生命结束了,但是浏览器可能没有删除这个Cookie,只是每次请求的时候不会携带这个Cookie了
- 是通过setMaxAge(int expiry)设置Cookie的生命周期的,如果没有设置都是默认值,也就是会话级别,浏览器关闭就生命结束了,这个以秒为单位。
- 正数,表示在指定的秒数后过期
- 负数,表示浏览器关闭,Cookie就会被删除(默认值是-1)
- 0,表示马上删除cookie,浏览器会删除该Cookie,也就是在它的本地删除
6. Cookie的有效路径规则
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不可以发。path属性通过请求的地址来进行有效的过滤
规则如下:
cookie1.setPath = /工程路径 cookie2.setPath = /工程路径/aaa
请求地址:http://ip:port/工程路径/资源
- cookie1会发给服务器
- cookie2不会发给服务器
请求地址:http://ip:port/工程路径/aaa/资源
- cookie1会发给服务器
- cookie2会发给服务器
注意,只要请求地址包含Cookie设置的path就会被http请求给携带,所以大部分情况是使用默认的path,也就是/工程路径
7.Cookie注意事项和细节
- 一个Cookie只能标识一种信息,它至少有一个标识该信息名称(NAME)和设置值(VALUE)
- 一个WEB站点可以给一个浏览器发送多个Cookie,一个浏览器也可以存储多个WEB站点提供的Cookie
- Cookie的总量没有限制,但是每一个域名的Cookie数量和每个Cookie的大小是有限制的(不同的浏览器限制不同,注意即可),Cookie不适合存放数据量大的信息
- 注意,删除Cookie是,Path必须一致,否则不会删除
- 注意,Cookie存放中文会报错,得将中文编码成可以存放的格式
- 可以通过URL编码和解码来解决,不建议存放中文的Cookie信息
二、session
1.Session原理示意图
- 当用户打开浏览器,访问某个网站,操作session时服务器就会在内存中(在服务端)为该浏览器分配一个session对象,该session对象被这个浏览器独占
- 这个session对象也可以看做是一个容器,session对象默认存在时间为30分钟,也可以在tomcat的conf目录下的web.xml修改
2.Session作用
- 网上商城中的购物车
- 保存登录用户的信息
- 将数据放入到Session中,供用户在访问不同页面时,实现款页面访问数据
- 防止用户非法登录到某个页面
3.如何理解Session
session存储结构示意图
你可以把Session看作是一个容器类HashMap,有两列(key-value),每一行就是Session的一个属性
每个属性包含有两个部分,一个是该属性的名字(String),另外一个是它的值(Object)
4.Session的基本使用
创建和获取Session,是同一个方法,API一样
HttpSession session = request.getSession(); //第一次调用是创建Session会话,之后调用是获取创建好的Session对象
向Session添加属性
session.setAttribute(String name,Object object);
从Session得到某个属性
Object obj = session.getAttribute(String name);
从Session删除掉某个属性
session.removeAttribute(String name);
判断是不是刚创建出来的Session
session.isNew();
每一个Session都有一个唯一标识的ID
session.getId();
5.Session生命周期-说明
- public void setMaxInactiveInterval(int interval)设置Session的超时时间(以秒为单位),超过指定的时长,Session就会被销毁
- 值为正数的时候,设定的为Session的超时时长,记住Session的生命周期是两次会话的间隔,若果两次会话超过设定的时间,则会被销毁,如果在间隔时间内则会再刷新时间,从零开始计时
- 负数表示永不超时,除了服务器重启
- public int getMaxInactiveInterval()获取Session的超时时间
- public void invalidate()让当前Session会话立即无效
- 如果没有调用setMaxInactiveInterval()来指定Session的生命时长,Tomcat会以Session默认时长为准,Session默认的超时为30分钟,可以在Tomcat的web.xml设置
- Session的生命周期指的是:客户端/浏览器两次请求最大间隔时长,而不是累积时长。即当客户端访问了自己的Session,Session的生命周期将从0开始重新计算(指的是同一个会话两次请求之间的间隔时间,如果在生命周期的时间内,则生命周期又从0开始计时)
- 底层:Tomcat用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁
6.生命周期注意事项
- 指的是两次访问Session的最大间隔时间
- 如果你在Session没有过期的情况下,操作Session,则会重新开始计算生命周期
- Session是否过期,是由服务器来维护和管理的
- 如果我们调用了invaliate()会直接将该Session删除/销毁
- 如果希望删除Session对象的某个属性,使用removeAttribute();