目录
1、会话是什么
用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应:
从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了。
建立之后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着,浏览器和服务器就可以继续使用该会话进行请求发送和响应。
举例:
打开浏览器进入购物网站的首页后,浏览器与购物网站就建立了一次会话,后面的搜索商品、查看商品的详情、加入购物车等都是在这一次会话中完成的。如果打开多个浏览器访问这个网站,每个浏览器都会与服务端建立了一个会话。
2、会话跟踪是什么
是一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话多次请求间共享数据:
服务器收到多个请求,他们可能来自多个浏览器,服务器需要识别请求是否来自同一个浏览器,这个识别过程就是会话跟踪。服务器识别浏览器后就可以在同一个会话中多次请求之间共享数据。
应用场景举例:
购物车:加入购物车和去购物车结算是两次请求,但是后一次请求需要展示前一次请求所添加的商品,就要用到数据共享。
页面展示用户登录信息:登录网站后,在发出不同请求访问不同功能时,都会展示当前登录用户的信息,如用户名。
登录页面的“记住我”功能:用户登录时,勾选“记住我”按钮,登录成功后,下次再登录时,网站就会自动填充用户名和密码,简化用户的登录操作。多次登录就会有多次请求,他们之间涉及到共享数据。
登录页面的验证码功能:生成验证码、输入验证码点击注册是两次请求,这两次请求的数据之间要进行对比,相同则允许注册,不同则拒绝注册,该功能的实现需要在同一次会话中共享数据。
3、HTTP协议不提供会话跟踪
浏览器和服务器之间使用HTTP进行数据传输,而HTTP协议是无状态的。每次浏览器发出请求,服务器都会将该请求视为新的请求(HTTP协议设计成无状态的目的是让每次请求之间相互独立、互不影响),所以无法实现多次请求之间的数据共享。
4、会话跟踪的实现方式
最常见的是使用Cookie和Session,其他还有Token认证、OAuth等。
5、客户端会话跟踪技术 Cookie
将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
Cookie以键值对的形式存在,当用户第一次请求服务时,Cookie信息会随着服务器端的响应发送给客户端浏览器,然后客户端浏览器会把Cookie保存起来,当下一次客户端发起请求时携带此信息作为用户的唯一标识发送给服务器。
比如,服务端提供了两个Servlet,分别是ServletA和ServletB:
浏览器发送HTTP请求1给服务端,服务端ServletA接收请求并进行业务处理,在处理时创建了一个Cookie对象并将 name=Tom 的数据存入Cookie。服务端ServletA在响应数据的时候,会把Cookie对象响应给浏览器。
浏览器接收到响应数据,会把Cookie对象中的数据存储在浏览器内存中,此时浏览器和服务端就建立了一次会话。
在同一次会话中浏览器再次发送HTTP请求2给服务端ServletB,浏览器会携带Cookie对象中的所有数据。ServletB接收到请求和数据后,就可以获取到存储在Cookie对象中的数据,这样同一个会话中的多次请求之间就实现了数据共享。
1)怎样使用
发送Cookie:
创建Cookie对象,并设置值:Cookie cookie = new Cookie("key","value");
使用Reponse对象发送Cookie到客户端:response.addCookie(cookie);设置Cookie有效期(可选,默认浏览器关闭即销毁):cookie.setMaxAge(int seconds)
获取Cookie:
使用Request对象获取Cookie数组:Cookie[ ] cookies = request.getCookies();
遍历数组,获取数组中每个Cookie对象的值:cookie.getName()、cookie.getValue()
应用举例:设置 "username","Tom" 到 Cookie 并获取:
步骤一:存入Cookie
在Servlet中创建Cookie对象,存入数据,发送给前端
@WebServlet("/cookieServlet")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//发送Cookie
//1. 创建Cookie对象
Cookie cookie = new Cookie("username","Tom");
//2. 设置Cookie的有效期(可选)
cookie.setMaxAge(60*60*24*7); // 有效期为1周
//3. 将Cookie添加到响应中
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
启动,访问 http://localhost:8080/understandTomcat/CookieServlet,
在浏览器打开开发者工具-Applications-Cookies中查看。
步骤二:获取Cookie
@WebServlet("/cookieServlet2")
public class CookieServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1. 获取Cookie数组
Cookie[] cookies = request.getCookies();
//2. 遍历数组,查找名为"username"的Cookie
for (Cookie cookie : cookies) {
//获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
System.out.println(name+":"+value);
break;
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
启动,访问 http://localhost:8080/understandTomcat/CookieServlet2 在控制台打印出获取的值。
username:Tom
怎样用Cookie存储中文:使用URL编码与解码
应用举例:
ServletA 编码:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.发送Cookie
String value = "张三";
//对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
//将编码后的值存入Cookie中
Cookie cookie = new Cookie("username",value);
//2. 将Cookie添加到响应中
response.addCookie(cookie);
}
ServletB 解码:
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
//1. 获取Cookie数组
Cookie[] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
//URL解码
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name+":"+value);//value解码后为 张三
break;
}
}
2)原理
ServletA给客户端发送Cookie、ServletB从Request对象中获取Cookie,在这个过程中:
Tomcat服务器是基于HTTP协议来响应的,当ServletA响应数据时,如果Tomcat发现后端要返回的是一个Cookie对象,Tomcat就会在HTTP的响应头中添加一行数据:
Set-Cookie:username=Tom
浏览器获取到响应结果后,从响应头中就可以获取到 Set-Cookie 对应值 username=Tom 并将数据存储在浏览器的内存中。
当浏览器再次发送请求给ServletB时,浏览器会自动在请求头中添加:
Cookie: username=Tom 发送给服务端ServletB。
Request对象会把请求头中Cookie对应的值封装成一个或多个Cookie对象,形成一个数组。ServletB通过Request对象获取Cookie数组,从而获取到自己需要的数据。
浏览器打开开发者工具可以在请求头的中查看。
标签:浏览器,请求,技术,value,会话,Cookie,cookie From: https://blog.csdn.net/u010852547/article/details/136512746