一次会话中包含多次请求和响应。而一次会话指浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开位置。
会话技术的主要功能:在一次会话范围内的多次请求和响应间,共享数据。
因为HTTP协议的缘故,浏览器和服务器的每次请求和响应都是独立的,数据不能共享。因此会话技术的提出就是解决这一问题。
会话可简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中要解决一些问题:每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据;那么怎样解决这样的问题呢?——借助于两种会话技术Cookie与Session。
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Cookie的实现原理:基于响应头set-cookie
和请求头cookie
实现。
使用步骤:
(1)创建Cookie对象,绑定数据。new Cookie(String name,String value)
(2)发送Cookie对象。response.addCookie(Cookie cookie)
(3)获取Cookie中的数据。Cookie[]=request.getCookies()
// 1.创建Cookie对象
Cookie cookie = new Cookie("msg","HelloCookie");
// 2.发送Cookie
response.addCookie(cookie);
// 3.获取Cookie
Cookie[] cookies = request.getCookies();
// 4.获取数据,便利Cookies
if (cookies != null) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
String value = cookie.getValue();
System.out.println(cookieName + ":" + value);
}
}
若出现以下错误信息,原因是Tomcat的版本比较高,所以在addCookie时是不能使用空格的。
特点
①Cookie储存数据在客户端浏览器,安全性差,容易丢失或篡改。
②浏览器对于单个Cookie的大小有限制(一般4kb以内),以及对同一个域名下的总Cookie数量(一般20个以内)也有限制。
作用
①cookie一般用于储存少量的不太敏感的数据。
②在不登录的情况下,完成服务器对客户端的身份识别。可以理解为,浏览器将用户的一些“个性化设置”保存到cookie中,用户一旦使用,浏览器就可以读取cookie获取用户的“个性化设置”。
创建多个Cookie对象,使用response调用多次addCookie()方法发送Cookie即可。
①默认情况下,当浏览器关闭后,Cookie数据被销毁。
②可以设置Cookie的生命周期,来达到持久化储存,即关闭浏览器后Cookie数据依旧存在。
setMaxAge(int seconds);
seconds的取值 | 描述 |
---|---|
正数 | 设置Cookie的存活时间,并将Cookie数据写到硬盘的文件中 |
负数 | 默认值,即浏览器关闭后,Cookie数据被销毁 |
0 | 特殊值,删除Cookie信息 |
①在Tomcat 8之前Cookie不能直接储储存中文数据。需要将中文数据进行转码后储存,一般采用URL编码(%E4)。
②Tomcat 8之后支持储存中文数据,但不支持特殊字符。
// 使用URL编码后的codeStr
codeStr = URLEncoder.encode(str,"utf-8");
// 使用URL解码后的
decodeStr = URLDecoder.decode(value,"utf-8");
问题:假设在一个Tomcat服务器中,部署了多个Web项目,name在这些Web项目中Cookie能否共享数据?
答案:默认情况下Cookie不能共享数据。因为其中setPath(String path)
方法设置了Cookie的获取范围,该方法的默认是当前虚拟目录(当前Web项目),所以默认情况下Cookie不能共享数据。
但如果想要Cookie共享数据,则可以将该方法路径设置为setPath("/")
即可,/
表示根目录。
问题:假设不同的Tomcat服务器间Cookie能否共享?
答案:可以。使用setDomain(String path)
方法,如果设置一级域名相同,那么多个Tomcat服务器之间Cookie可以共享。
例如setDomain(".baidu.com")
,那么tieba.baidu.com和new.baidu.com之间Cookie可以共享。
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
Session的实现原理:Session是依赖于Cookie来实现。
使用步骤:
(1)获取HttpSession对象,HttpSession session = request.getSession()
(2)使用HttpSession对象,见下表:
描述 | 方法 | 返回类型 |
---|---|---|
获取Session对象中以name为键的值 | getAttribute(String name) | object |
存储以name为键的value值到Session对象 | setAttribute(String name, Object value) | void |
删除Session对象中以name为键的值 | removeAttribute(String name) | void |
// 获取Session对象
HttpSession session = request.getSession();
// 储存数据
session.setAttribute("msg","Hello Session");
// 读取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
// 删除数据
session.removeAttribute("msg");
特点
①Session用于存储一次会话中多次请求的数据,存储存在服务器端。
②Session可以存储任意类型,任意大小的的数据。
③Session数据具有安全性。
答案:默认情况下不是同一个。
如果想要是同一个的话,可以创建一个键为JSESSIONID的Cookie,并设置最大存活时间,让Cookie持久化保存。这样,在使用的时候我们去读取这个JSESSIONID的Cookie即可。
答案:不是同一个,服务器关闭后,Session对象会被销毁。
虽然两个Session不是同一个,但我们要确保这Session里保存的数据不丢失。
这里引申Session的钝化和活化两个概念。
钝化: 在服务器正常关闭之前,将Session对象序列化到硬盘上。
活化:在服务器启动后,将Session文件转化为(反序列化)内存中的Session对象。
Tomcat服务器可以自己去将Session自动钝化和活化。
①服务器关闭时,Session被销毁。
②调用invalidate()
方法销毁Session。
③Session默认30分钟后失效,这个失效时间可以自己配置。
演示配置Session失效时间: