1 cookie & session
1 会话
1.1背景:在用户登录后,如何保证这个用户进入web应用的每个界面都能正确的显示用户的名字?
在购物网站上将购物的数据添加到购物车功能?
1.2 HTTP是一个无状态的协议,也就是每次用户通过浏览器访问服务器,对于server,并不知道是谁在访问。为了保证每次浏览器访问时,让server区分出是谁访问,就需要用到会话技术(会话跟踪技术)。
1.3会话是从用户打开客户端访问web应用,到用户关闭客户端,整个过程称为一次会话。
当然,客户端访问web应用,OS就会开辟一块内存空间存储访问过程中的数据,直到用户关闭客户端(比如浏览器),内存中的数据就会被清空,毕竟内存是个重复使用的。
1.4会话跟踪技术:
1 cookie:把数据存储客户端(比如浏览器)上的,减少服务器端存储数据的压力,但是安全性不好,客户端是可以清楚cookie。
2 session:把数据存储服务器上的,安全性相对好,增加服务器存储数据的压力。
实质,通过cookie或session保存一些数据,实现数据共享。也可以认为cookie或session也是域。
1.5 cookie存储过程(原理)
首先,server将需要存储的数据放在cookie对象中,通过response header的形式发送给client,client收到header之后,就会将数据保存。
其次,client再次请求server的时候,就会将此信息放在request header中,则server就可以通过request header就能得到不同用户的cookie,从而区分出是哪个用户,然后再做不同的处理。
1.6 创建cookie
1.7 发送给客户端
1.8 设置cookie存取时间
默认cookie是会话级别的,即关闭浏览器,cookie就某了,也就是说cookie存储在本机的内存之中
也可以设置cookie的存取时间,设置之后会将cookie存储到本地硬盘之中。
设置为0 会覆盖同名同路径的cookie(可以理解成把之前同名的cookie删除掉)
1.9 设置路径
默认会在请求和servlet同路径下才会携带cookie中存储的数据,(例如从第二次开始每次请求的servlet的路径/login,则每次都会携带第一次server返回给browser的cookie中的数据)
包含同级目录和子目录(比如请求的path为/login/laosun)
当然我们可以设置cookie携带的路径
总结:
1 浏览器只做请求,服务端才验证到底是谁请求的
2 服务器端 在servlet中创建cookie,并将cookie响应给浏览器。
3 浏览器再次请求服务器,同时请求的路径是符合cookie
1、Cookie服务器端会话技术
将数据保存在客户端的技术
1.1、创建Cookie对象,绑定数据
new Cookie(String name,String value);
1.2、发送Cookie对象
response.addCookie(Cookie cookie);
1.3、获取Cookie,拿到数据
request.getCookies();
2、Session服务器端会话技术
3.实现原理
基于响应头set-cookie和请求头cookie执行的
4.cookie细节
4.1 一次可以发送多个cookie
4.2 cookie在浏览器中保存多长时间?
4.2.1默认情况下,当浏览器关闭后,cookie数据被销毁
4.2.2持久化存储
setMaxAge(int seconds)
1.正数:将cookie数据写到硬盘的文件中。持久化存储。cookie存活时间,也就是说,在设置的时间之内,浏览器关闭cookie也没有被删除
2.负数:默认值,存在浏览器中,浏览器一旦关闭,cookie值就没有了
3.零:删除cookie信息
4.2.3在Tomcat8之前,cookie中不能直接存储中文数据(需要将中文数据转码----一般采用URL编码),之后 就能存储中文了
4.2.4cookie获取范围:假设在一个Tomcat服务器中,部署了多个web项目,默认情况下cookie不能共享
setpath(String path):设置cookie的获取范围。
如:setpath("/项目名");–设置为指定项目可以访问
setpath("/") —设置为只要在浏览器的根目录下的项目都能访问
不同的Tomcat服务器间cookie共享问题
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
如:setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
5.cookie的特点和作用:
5.1 cookie存储数据在客户端浏览器
5.2 浏览器对于单个cookie的大小有限制(4KB左右)以及对同一个域名下的总cookie数量也有限制(20个)
作用:
1.cookie一般用于存储少量的不太敏感的数据
2.在不登录的情况下,完成服务器对客户端的身份识别
显示上次访问的时间
#Session
1.概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HTTPSession
2.快速入门:
2.1获取session对象
HttpSession session = request.getSession();
2.2使用HTTPSession对象
session.setAttribute(“msg”,“hello session”);
HttpSession session = request.getSession();
Object msg = session.getAttribute(“msg”);
System.out.println(msg);
3.原理:session的实现是依赖于cookie的
服务器如何确保在一次会话范围内,多次获取的session对象是同一个。
session是依赖于cookie的,第一次获取session,没有cookie,会在内存中创建一个新的session对象
并且这个session有一个唯一的id值,给浏览器响应的时候会发送一个set-cookie头里边有session的id
下一次浏览器请求的时候,cookie值中也会有一个session值,它传递到服务器的时候会比较两个session对象
4.细节:
4.1当客户端关闭后,服务器不关闭,两次获取的session为同一个吗?
默认情况下不是的,
如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie(“JSESSIONID”,session.getId());
c.setMaxAge(60*60);
response.addCookie©;
4.2客户端不关闭,服务器关闭时,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失
session的钝化:
在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
购物车对象是在session对象中
4.3 session什么时候被销毁?
4.3.1.服务器关闭
4.3. 2.session对象调用invalidate()。
4.3. 3.session默认的销毁时间是30分钟
我们可以选择性的修改配置web.xml文件中
5.session特点:
5.1session用于存储一次会话的多次请求的数据,存储在服务器端。
5.2session可以存储任意类型,任意大小的数据
6.session与cookie的区别:
session存储数据在服务器端而cookie在客户端
session没有数据大小限制,cookie有
session在服务器端,更安全,相对来说cookie不安全