会话:
用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。
在一次会话中可以包含==多次请求和响应==。
从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
用实际场景来理解下会话,比如在我们访问京东的时候,当打开浏览器进入京东首页后,浏览器和京东的服务器之间就建立了一次会话,后面的搜索商品,查看商品的详情,加入购物车等都是在这一次会话中完成。
==总结==:打开一次浏览器访问一次项目页面就相当于是一次会话
会话跟踪:
一种==维护浏览器状态==的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间==共享数据==。
服务器会收到多个请求,这多个请求可能来自多个浏览器
服务器需要用来识别请求是否来自同一个浏览器
服务器用来识别浏览器的过程,这个过程就是==会话跟踪==
服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据
那么我们又有一个问题需要思考,一个会话中的多次请求为什么要共享数据呢?有了这个数据共享功能后能实现哪些功能呢?
购物车: `加入购物车`和`去购物车结算`是两次请求,但是后面这次请求要想展示前一次请求所添加的商品,就需要用到数据共享。
浏览器和服务器之间使用的是HTTP请求来进行数据传输
HTTP协议是==无状态==的,每次浏览器向服务器请求时,服务器都会将该请求视为==新的==请求
HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
请求与请求之间独立后,就无法实现多次请求之间的数据共享
会话跟踪技术分为两种方法实现
(1)客户端会话跟踪技术:==Cookie==
(2)服务端会话跟踪技术:==Session==
这两个技术都可以实现会话跟踪,它们之间最大的区别:==Cookie是存储在浏览器端而Session是存储在服务器端==
==总结==:HTTP协议是无状态的,靠HTTP协议是无法实现会话跟踪
想要实现会话跟踪,就需要用到Cookie和Session
什么是Cookie:
将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie实现步骤
1.创建Maven项目,项目名称为cookie-demo,并在pom.xml添加依赖
2.编写Servlet类,名称为AServlet
3.在AServlet中创建Cookie对象,存入数据,发送给前端
4.启动测试,在浏览器查看Cookie对象中的值
Cookie中常用的方法
Cookie cookie = new Cookie("username", "张三");创建Cookie对象
cookie.setMaxAge(60*60*24*7);60*60*24*7代表一周
//设置有效时间:三种取值:>0:有效时间,以秒为单位。=0:浏览器关闭。<0:默认
addCookie();给cookie添加到addCookie对象中
Cookie[] cookies = req.getCookies();获取Cookie数组
getName();获取Cookie的name
getValue();获取Cookie的value
package com.hsd.controller;
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("/AServlet")
public class AServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("username","张三");
//设置有效时间:三种取值:>0:有效时间,以秒为单位。=0:浏览器关闭。<0:默认
cookie.setMaxAge(60*60*24*7);//60秒,60*60*24代表一天,60*60*24*7代表一周
// 将cookie添加到域中
resp.addCookie(cookie);
//
}
}
package com.hsd.controller;
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("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Cookie
Cookie[] cookies = req.getCookies();
//遍历Cookie数组
//避免空指针异常
if(cookies!=null) {
for (Cookie cookie : cookies) {
//获取cookie对象中的name值
String name = cookie.getName();
//获取cookie对象中的value值
String value = cookie.getValue();
System.out.println(name + "-------" + value);
}
}
}
}
什么是Session:重点
将数据保存到服务端
Session中常用的方法
HttpSession session = req.getSession();创建Session()对象
session.setAttribute("username","zs");给session对象中存储数据
session.getAttribute("username");使用getAttribute通过key获取value值
session.removeAttribute("username");使用removeAttribute通过key删除value值
package com.hsd.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/Session1")
public class Session1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Session对象
HttpSession session = req.getSession();
System.out.println(session);
//给Session对象中存储数据
session.setAttribute("username","zs");
}
}
package com.hsd.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/Session2")
public class Session2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建Session对象
HttpSession session = req.getSession();
System.out.println(session);
//使用getAttribute通过key获取session中的值
Object username = session.getAttribute("username");
System.out.println(username);
//通过removeAttribute删除session的数据
//session.removeAttribute("username");
}
}
package com.hsd.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/Session3")
public class Session3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
System.out.println(session);
//通过removeAttribute删除session的数据
session.removeAttribute("username");
}
}
Cookie和Session的区别:
Session是存储在服务端而Cookie是存储在客户端
存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
存储在服务端的数据相比于客户端来说就更安全
Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
Session把用户的数据写到用户独占(sessionId是唯一的)的Session中,服务器端保存(保存重要的信息,避免服务器资源的浪费)
Session对象由服务器创建
session创建时干了什么?
Cookie cookie=new Cookie("JSESSIONID",sessionId);
resp.addCookie(cookie);
使用场景:
1、保存一个用户登录的信息
2、购物车信息
3、整个网页中经常使用的数据,将它保存到Session中