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相对不安全