会话跟踪技术学习
-
会话:用户打开浏览器,访问web服务器的资源,这时候就建立了一个会话,直到有一方断开连接,会话结束。再一次会话中,可以包含多次请求以及响应。
- 这啥意思呢? 就是比方说我用电脑打开了一个浏览器,访问淘宝官网,这时候就相当于是与淘宝的服务器建立了一个会话,只要我浏览器不关闭,不管我是对淘宝的服务器发出了多少次请求,我这都属于是一个会话。
- 也就是说,“会话”是跟浏览器绑定的。
-
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
- 比如我通过浏览器访问淘宝官网,添加了某个商品到购物车,这是一次会话,然后我点击“查看购物车”这又是一次会话,我能够看到我购物车中多了这么一件商品,这就是实现了所谓的同一个会话中的“数据共享”
-
▲ 实现方式
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
Cookie
Cookie基本使用
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
Cookie的基本使用
-
发送Cookie
- 创建Cookie对象,设置数据
Cookie cookie = new Cookie("key","value"); - 发送Cookie到客户端:使用response对象
response.addCookie(cookie);
- 创建Cookie对象,设置数据
-
获取Cookie
-
获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies = request.getCookies(); -
遍历数组,获取每一个Cookie对象,使用for循环即可
-
使用Cookie对象方法获取数据
cookie.getName();获取键cookie.getValue();获取值
-
这里仍然是写一个小Demo来完成:
首先CookeDemo1:
作为服务器端创建Cookie对象,设置数据,并且将创建的Cookie使用response对象,发送到客户端
package com.itheima.web.cookieDemos;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie=new Cookie("username","nylonmin");
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
这里我使用的是windows自带的edge浏览器,访问地址为http://localhost:8080/tomcat_demo1/cookieDemo1
访问之后,通过直接查询浏览器中已经保存下来的cookie,可以看到如下图:
我们自己设置并且发送的cookie已经存储到浏览器中了
接下来继续写CookieDemo2
因为一个会话中可能发送多个cookie,每个cookie都有不同的用处。所以我们需要根据其 “name”来提取我们自己真正需要的那个。
这里实际上就能看到控制台输出的是nylonmin
package com.itheima.web.cookieDemos;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie c:cookies){
String name = c.getName();
if("username".equals(name)){
System.out.println(c.getValue());
break;
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
Cookie原理
Cookie的实现是基于HTTP协议的。
-
服务器创建Cookie
- 服务器在响应客户端请求时可以创建一个或多个 Cookie,然后我们在通过
HttpServletResponse response对象addCookie的时候。服务器(我们这里是Tomcat)会自动识别,并在正儿八经发送响应的时候,在 HTTP 响应头中发送给客户端。这通常是通过设置Set-Cookie响应头来实现的。
- 服务器在响应客户端请求时可以创建一个或多个 Cookie,然后我们在通过
-
浏览器存储Cookie
- 浏览器接收到包含
Set-Cookie头的响应后,会读取 Cookie 信息,并根据服务器指定的属性(如过期时间、路径、域等)将其存储在本地。浏览器通常将 Cookie 存储在内存中,并且在某些情况下,也会将它们持久化存储到磁盘上,以便在浏览器关闭后再次打开时仍然可用。
- 浏览器接收到包含
-
后续请求携带Cookie
- 在同一域名下的后续 HTTP 请求中,浏览器会自动在请求头中包含
Cookie头,将存储的 Cookie 发送回服务器。这允许服务器识别用户会话和状态。 - Cookie 有域和路径属性,它们定义了 Cookie 的作用域。只有发送到相同域和路径的请求才会携带 Cookie。
- 在同一域名下的后续 HTTP 请求中,浏览器会自动在请求头中包含
Session
这里我们直接来对Seesion的原理来进行一个小小的说明;
首先,还是一定一定要明确,Sesson是把数据存储到 服务端
那么就引出一个小小的问题,ok,你说Session是存储在服务端的,那么如果我这个时候,有一个新的浏览器进来,同样是访问这个界面,总不可能我这个新的浏览器获取的Session也是同一个Session吧?
—— 首先,Session也是基于会话的,也就是说一个会话,一个Session
Session实际上是基于Cookie来实现的
-
创建 Session:
- 当用户首次访问服务器时,服务器会创建一个新的 Session。这个 Session 会有一个唯一的标识符,称为 Session ID。
-
发送 Session ID:
- 在正式响应请求的时候,服务其发现,你小子用了Session是吧,ok,那我就自动把将 Session ID 发送给客户端,通常是通过设置一个名为
JSESSIONID的 Cookie 发送的。
- 在正式响应请求的时候,服务其发现,你小子用了Session是吧,ok,那我就自动把将 Session ID 发送给客户端,通常是通过设置一个名为
-
存储 Session 数据:
- 服务器在内存或数据库中存储 Session 数据,使用 Session ID 作为键来检索和存储数据。
-
后续请求:
- 用户的每个后续请求都会包含 Session ID(通常在 Cookie 中),服务器使用这个 ID 来检索对应的 Session 数据。
- 每次用户访问服务器时,服务器都会生成一个新的、唯一的 Session ID。这意味着即使两个用户同时访问服务器,他们也会获得不同的 Session ID。
- 浏览器对 Cookie 的处理是隔离的,每个浏览器实例都有自己的 Cookie 存储空间。因此,不同浏览器的请求将携带不同的 Cookie,包括 Session ID。
总结
Cookie和Session都是用来完成以此会话内多次请求之间的数据共享的。
区别:
- 存储位置:Cookie是将数据存储在客户端,Session是将数据存储在服务器端
- 安全性上:Cookie不安全,因为用户可以直接通过浏览器看到cookie中的内容,Session安全
- 数据大小:Cookie最大3KB,Session无大小限制
- 存储时间:Cookie可以长期存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占用服务器资源