首先学习Cookie 和 Session ,token 先要了解会话技术
目录
1.会话技术的理解:
1.会话:就是用户打开浏览器,访问web服务资源,会话建立,一旦有一方断开连接,会话结束,
在一次会话中包含 多次 请求和响应。
-
从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
-
会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
-
浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为==会话==。
2.会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间==共享数据==
-
服务器会收到多个请求,这多个请求可能来自多个浏览器
-
服务器需要用来识别请求是否来自同一个浏览器
-
服务器用来识别浏览器的过程,这个过程就是==会话跟踪==
-
服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据
问题:
为什么现在浏览器和服务器不支持数据共享?
1.浏览器和服务器之间使用的是HTTP请求来进行数据传输
2.HTTP 协议是 无状态 的,每次浏览器向服务器请求时,服务器都会将该请求视为==新的==请求
3.HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
4.请求与请求之间独立后,就无法实现多次请求之间的数据共享
cookie、session与token的真正区别_东北一绝、英俊侠的博客-CSDN博客_token和session和cookie的区别
2.客户端会话跟踪技术 ---- Cookie
1.概念:Cookie 客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
cookie是什么?有什么用?cookie详解,一篇文章彻底搞懂cookie_秃头披风侠.的博客-CSDN博客_cookie是什么
Cookie就是一些数据,用于存储服务器返回给客服端的信息,客户端进行保存。在下一次访问该网站时,客户端会将保存的cookie一同发给服务器,服务器再利用cookie进行一些操作。利用cookie我们就可以实现自动登录,保存游览历史,身份验证等功能。
2.1 Cookie的使用:
服务器创建cookie 给浏览器响应:
@GetMapping("/goodsList")
public void getGoodsList(HttpServletRequest request, HttpServletResponse response) {
Cookie cookie = new Cookie("cookieName","cookieValue");
cookie.setHttpOnly(true); // 只允许服务端修改
cookie.setMaxAge(60*10); // 过期时间一小时 默认永久
cookie.setValue("newValue"); //重新设置cookei值
response.addCookie(cookie);//给浏览器响应
}
服务器创建cookie 将其设置些内容 并返回给服务器。
当下一次请求时,浏览器要以请求头的方式,发送给服务器。
服务器怎么拿到呢?
@GetMapping("/goodsList1")// 获取所有cookie
public void getGoodsList1(HttpServletRequest request, HttpServletResponse response) {
//HttpSession session = request.getSession();
//session.setAttribute("key","value");
//session.setAttribute("key2","value2");
Cookie[] cookies = request.getCookies(); // 获取所有cookie
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());//键
System.out.println(cookie.getValue());//值
}
}
3.服务端会话跟踪技术 ---- Session
为什么会有session ,Cookie已经能完成一次会话多次请求之间的数据共享,之前我们还提到过Session也可以实现,那么有session干什么?
1.假如将所有的信息都存入session ,都存到服务器中,那么服务器压力指定会大,
2.cookie是存在本地客户端的,数据容易被窃取和截获(session比cookie更安全);
==Session==:服务端会话跟踪技术:将数据保存到服务端。
Session是存储在服务端而Cookie是存储在客户端
存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
存储在服务端的数据相比于客户端来说就更安全
session的基本使用
在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。
具体的使用步骤为:
-
获取Session对象,使用的是request对象
HttpSession session = request.getSession();
-
Session对象提供的功能:
-
存储数据到 session 域中
void setAttribute(String name, Object o)
-
根据 key,获取值
Object getAttribute(String name)
-
根据 key,删除该键值对
void removeAttribute(String name)
-
这两个技术都可以实现会话跟踪,它们之间最大的区别:==Cookie的数据信息是存储在浏览器端而Session的数据信息是存储在服务器端==
1.设置session 保存到浏览器
@GetMapping("/goodsList1")// 获取所有cookie
public void getGoodsList1(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.setAttribute("key","value");
session.setAttribute("key2","value2");
// Cookie[] cookies = request.getCookies(); // 获取所有cookie
// for (Cookie cookie : cookies) {
// System.out.println(cookie.getName());//键
// System.out.println(cookie.getValue());//值
// }
}
2.发送一次请求
拿到 session 得值
@GetMapping("/goodsList2")// 获取所有cookie
public void getGoodsList2(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
Object key = session.getAttribute("key");
Object key2 = session.getAttribute("key2");
System.out.println(key);
System.out.println(key2);
System.out.println(request.getSession().getId());
}
简单方法创建session
@GetMapping("/goodsList3")// 获取所有cookie
public void getGoodsList3(HttpSession session) {
session.setAttribute("hhhh","heiehei");
}
@GetMapping("/goodsList4")// 获取所有cookie
public void getGoodsList4(HttpSession session) {
Object hhhh = session.getAttribute("hhhh");
System.out.println(hhhh);
}
如果代码出问题将类上的 @Controller 注解 变成@RestController 试试
https://www.baidu.com/link?url=Itk54bcERK9940_umNqh1slxExzfTxykDAhJLcbRXJ2uAbIj55oUOuAEuf9Rj7kDUq7Zmfv6A3ZtRPiuiAJFIiIziIBZNAZoZCKwA_x5fgW&wd=&eqid=a06a5d93000019a100000003637dc973 这篇文章讲的是 : JSESSIONID
SpringMVC中session的使用_Arno_Yu的博客-CSDN博客_session springmvc
5.session和Cookie简单面试题
1.cookie和session的区别?
cookie | session | |
1.储存位置 | 客户端浏览器上 | 服务器上 |
2.储存容量 | 保存的数据<=4kb 一个站点最多20个token |
没有上限,但是服务器性能考虑, session中不要放太多东西 |
3.安全性不同 | 浏览器,安全性小 | 服务器,安全性高 |
4.有效期不同 | 可以设置cookie的属性,达到长期效果 | session依赖于名为JSESSIONID的cookie, 而JSESSIONID的过期时间默认为-1, 关闭弹窗session失效, |
5.服务器压力不同 | 保存客户端,不占用服务器, (对于并发多的网站,cookie好) |
服务端,每一个用户都会产生一个session (假如并发十分多,会产生很多session,耗费大量内存) |
。。。。
结论:
cookie是用来保证用户在未登录状态下身份的识别.
session是用来保证用户登陆后的数据.