会话、cookie、session
什么是会话?
会话是浏览器和服务器之间的多次请求和响应
为了实现某个功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止,这期间产生的多次请求和响应加在一起就称为浏览器和服务器的一次会话
会话数据存储在哪?
cookie存在浏览器端
session存在服务器端
cookie
cookie就像是浏览器和服务器传递的一张小纸条
cookie的产生过程:
服务器端:创建cookie并写给浏览器
浏览器端:存储cookie
浏览器端:请求服务器并向服务器传递cookie
服务器端:解析cookie,获取cookie中的数据
服务器关闭不会销毁cokie
浏览器关闭会销毁cookie(cookie默认存储在浏览器中)
cookie随着浏览器的关闭而销毁,新打开一个浏览器是没有之前的cookie的
cookie使用注意:
cookie存储数据是有限的,一般不超过4kb
一个网站的cookie也是有限的大约20到30个
一个浏览器上的cookie数量大约200到300个
cookie的应用场景:
1、浏览的历史记录(将商品的id存在cookie中)
2、七天自动登录(将用户名和密码存储在cookie中)
cookie的种类
会话级别的cookie:cookie存储在浏览器内存中,随着浏览器的关闭而销毁
持久化级别的cookie:设置cookie的生存时间,cookie存在浏览器指定的硬盘空间中,只有时间没到期,cookie就会一直存在
设置cookie的生存时间:setMaxAge(int expiry)单位是秒
取值:
负数:会话级别的cookie
0:立即过期
正数:存活的时间
七天自动登录:setMaxAge(60x60x24x7);
cookie的有效路径:浏览器将cookie保存在硬盘的路径,是各个浏览器自己制定,其他程序无法进行指定
有效路径:浏览器请求时,cookie的代入路径
请求路径:等于或者包含cookie的有效路径,该cookie会在请求时被代入
请求路径是从资源位置开始进行判断
设置有效路径。设置cookie允许被访问的路径。setPath(java.lang.String uri)
携带cookie:访问设置的路径,以及子路径都被允许访问
cookie1.setPath("/day15/aa"); uname
cookie2.setPath("/day15/aa/bb"); pwd
cookie3.setPath("/day15"); sex
访问路径1:http://localhost:8080/day15/
携带一个cookie:sex
访问路径2:http://localhost:8080/day15/qqq
携带一个cookie:sex
访问路径3:http://localhost:8080/day15/aa/www
携带两个cookie:uname、sex
访问路径4:http://localhost:8080/day15/aa/bb/www
携带三个cookie:uname\pwd sex
访问路径5:http://localhost:8080/day16
携带0个
不设置有效路径时:
是否默认是setPath("/day15")? 非也
如果Sevlet设置了该路径:@WebServlet("/www/cookie3")
只有访问/www目录下的路径才会携带cookie
需求:访问该项目下的所有资源都携带该cookie
手动设置:cookie.setPath(/项目名)
Session 域对象
会话技术存在服务器端的技术
Session和cookie的区别:
cookie:存在浏览器端,存储数据量小,安全性低
Session:存在服务器端,存储数据量大,安全性高
request.getSession();//获取到Session对象(从当前request中获取session,如果获取不到session,则会自动创建一个session,并返回新创建的session;如果获取到,则返回获取到的session; )
当第一次执行getSession(),会在响应头生成一个名字为JSESSIONID的一个cookie
当第二次以及以后执行getSession(),此时不再在响应头上生成JSESSION的cookie
第二次以及以后的请求,会以请求头的形式将JSESSIONID携带过去
session存储在服务器,在浏览器的只是JSESSION的cookie(实际上是session的id),这个用来会话请求时把这个session的id传递给服务器,服务器根据id查找session
新打开一个浏览器,就是开启一个新会话,服务器端会创建新的session对象,再把新的session对象的id响应给浏览器,之前的session对象还在服务器端,只是没有传递相应的session的id
浏览器关闭,会话结束。JSESSIONID销毁(会话级别的cookie)
session的生命周期
创建:第一次调用request.getSession();
销毁:
非正常关闭服务器时销毁session
正常关闭,会将session序列化到指定的硬盘空间中C:\java\apache-tomcat-8.5.29\work\Catalina\localhost\day15再次启动时反序列化到服务器中
手动调用invalidate() 可以销毁session
不操作session,30分钟后自动销毁tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
单位:分钟
</session-config>
session的常用方法:invalidate()、setAttribute、getAttribute、removeAttribute