Java基础强化(三)–Cookie与Session
一、会话技术
1.概念
会话是指浏览器与服务器之间的信息交互。
会话从浏览器第一次给服务器资源发送请求开始,直到有一方断开结束。一次会话包括多次请求与响应。
2.功能:
在一次会话的范围内,共享数据
3.方式:
1)客户端会话技术:Cookie
2)服务器端会话技术:Session
二、Cookie
1.概念
客户端会话技术,将数据保存到客户端
2.快速入门
在Demo1中创建并发送cookie
//创建cookie对象,调用new Cookie(String name,String value)
Cookie cookie = new Cookie(name,"张三");
//发送cookie对象,调用response.addCookie(Cookie cookie)
response.addCookie(cookie);
在Demo2中获取Cookie
//获取cookie,调用 Cookie[] request.getCookies()
Cookie[] cookies = request.getCookies()
3.Cookie实现原理
基于响应头set-cookie和请求头cookie实现
4.cookie的细节
1)可以一次创建多个cookie,使用response调用多次addCookie方法发送cookie即可
2)生命周期:
默认情况下,关闭浏览器之后,cookie数据被销毁
持久化存储:
setMaxAge(int seconds)
a.seconds为正数:将Cookie数据写到硬盘文件中,即持久化存储。数值越大,存活时间越长
b.seconds为负数:默认值,存在内存中,关闭浏览器,即销毁
c.seconds为零:删除Cookie信息
3)在Tomcat 8之前,Cookie中不能直接存储中文数据。
--需要将中文数据转码(一般采用url)
在8之后,Cookie支持中文数据
4)共享问题
在同一个Tomcat服务器中,部署多个web项目,默认情况下各个项目的Cookie是不能被其他项目共享的
如果需要共享,那么可以通过调用setPath(String path)方法来改变Cookie的获取范围,将其设置为"/",即服务器根目录
写法示例:
//创建Cookie对象
Cookie c1 = new Cookie("msg","你好");
//设置Path,令当前服务器下部署的所有项目共享Cookie信息
c1.setPath("\")
在不同Tomcat服务器下部署的服务器若要实现共享,则需要调用setDomain(String Path)方法
只要不同服务器之间的一级域名相同,则将path设置为以及域名,这些web项目即可共享kookie
示例:
//创建Cookie对象
Cookie c1 = new Cookie("msg","你好");
//设置domain,令tieba.baidu.com与new.baidu.com中cookie可以共享
c1.setDomain(".baidu.com")
5.Cookie特点
1)Cookie数据存储在客户端浏览器,安全性不强
2)浏览器对单个Cookie大小有限制,并对同一个域名下的总Cookie数也有限制(一般20)
6.Cookie作用
1)Cookie一般用在存储少量不太敏感的数据
2)在不登陆的情况下,完成服务器对客户端的身份识别
三、Session
1.概念:
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象
2.快速入门
1)获取HttpSession对象:
HttpSession session = request.getSeesion();
2) 使用HttpSession对象:
Object getAttribute(String name);
void setAttribute(String name,Object value);
void removeAttribute(String name);
3.原理
Session是依赖于Cookie的
第一次获取Session时,没有Cookie,会在内存中创建一个新的Session对象。并在Cookie中保存该session的地址。
在第二次获取Session时,Cookie会被客户端浏览器发送到服务器端,服务器端会去根据Cookie中的Session地址查找Session对象。
4.细节
1)在第一次访问结束后,关闭客户端,不关闭服务器。再重新打开客户端,访问服务器。那么,两次访问的session是否为同一个?
- 默认情况下,不是
- 如果要求为同一个,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
Cookie c - new Cookie ("JSESSIONID",session.getId()); c.setMaxAge(60 * 60); response.addCookie(c);
2)在第一次访问结束后,关闭服务器,不关闭客户端。再重新打开服务器,并让客户端访问服务器。那么,两次访问的session是否为同一个?
- 不是同一个,但是我们要确保数据不丢失
- session的钝化:
- 再服务器正常关闭之前,将session对象系列化到硬盘上
- session的活化:
- 再服务器启动之后,将session文件转化为内存中的session对象即可
session的活化与钝化,本地Tomcat服务器会自动帮我们完成。
但是如果使用IDEA工具,钝化的操作可以正常执行,活化的工作无法正常执行。
但是我们也不用担心这个问题,因为未来我们不可能在IDEA本地进行部署。
3.Session的销毁
1)服务器被关闭时,session失效
2)session的自杀方法:invalidate()
3)session默认失效时间:30分钟(可在web.xml中配置)
4.Session的特点、
1)用于存储一次会话的多次请求的数据,存在服务器端
2)Session可以存任意类型,任意大小的数据
3)Session数据安全,Cookie相对不安全