因为http是无状态的,但是用户每次将商品加入购物车时,就不知道这个客户是谁,继而不知道将商品加入到谁的购物车中
首先用通俗的语言来解释:
一、cookie就类似于纸质笔记本,服务器就像老师,浏览器就像学生,每次学生请教老师问题,老师就告诉学生答案,学生自己将问题和答案记在自己的笔记本上。下次学生再请教老师问题的时候,也要带着自己的笔记本去,这样老师就知道这个学生之前问过哪些问题,以便更好地知道学生的掌握情况。
当浏览器第一次请求服务器,服务器就是生成一个key=value的数据,放在http响应头的set-cookie属性中,浏览器看到了就会保存到本地,下次请求这个地址,就会自动带上。服务器通过http请求头的set-cookie属性值,就知道这个请求是谁发的。
老师有时候不知道这个笔记本是不是这个学生的,所以cookie可以被盗取。
二、session就像工牌,每个人身上的工牌只保存姓名和工号,详细的信息,例如部门、职位、工位等信息,都是保存在公司物业的名单上的
员工每次请求物业,物业就知道这个员工是谁,以及之前做过什么操作
为什么有了cookie,还要使用session?
1、如果浏览器禁用cookie,就会出现问题
2、如果将账户信息保存在cookie中,一旦数据被截取,就会存在数据泄漏
cookie是存储在客户端方,Session是存储在服务端方,客户端只存储SessionId
session是tomcat等容器创建的,也是tomcat来维护
如果服务器是多台,就可以将session存放到redis中
三、token就类似于令牌,服务器并不存储,只是签发,让浏览器存储。就像一个土匪窝给每个土匪都发了一块令牌,土匪之间可能不认识,土匪窝的门卫也不认识每一个人,但是门卫只需要校验这个令牌是不是真的就行,这个令牌基本无法伪造,因为它的加密方式,只有制作者知道。每次请求的时候,服务器的任务只是验证令牌的真实性,防止伪造。
这三种方式,如何使用代码实现?常用哪一种?
一、cookie登录用代码如何实现
在controller层的post调用方法中,写如下代码:
cookie c = new cookie(“name”,“jenkins”);
resp.addcookie©;
就可以在客户端的接受的http响应的响应头中看到:
Set-cookie: name=jenkins
其中,Set-cookie是key,name=jenkins是value,name是key,jenkins是value
二、session登录如何实现
在controller层的post调用方法中,写如下代码:
HttpSession session = request.getSession(true);
tomat容器就是自动生成sessionid放在http响应头的中
Set-cookie: JSESSIonID=3A21BE36578FC09777D3E33FE8561407; Path=/; HttpOnly
其中,Set-cookie是key,JSESSIonID=3A21BE36578FC09777D3E33FE8561407是value,JSESSIONID是key,3A21BE36578FC09777D3E33FE8561407是value
//绑定对象
void session.setAttribute(String name,Object boj);
//获取绑定对象
Object session.getAttribute(String name);
//移除绑定对象
void session.removeAttribute(String name);
//删除session对象
session.invalidate();
代码示例:
@RequestMapping("/testSessioon")
@ResponseBody
public String testSession(HttpServletRequest httpServletRequest){
HttpSession session = httpServletRequest.getSession(true);
//通过生成的session,绑定一对数据
session.setAttribute("testSession", "this is my session");
return "testSession";
}
@RequestMapping("/testGetSessioon")
@ResponseBody
public String testGetSession(HttpServletRequest httpServletRequest){
//在控制台打印sessionId
System.out.println(httpServletRequest.getSession().getId());
//接收客户端带过来的sessionId
//获取该session中存储的值,通过key获取value
Object testSession = httpServletRequest.getSession().getAttribute("testSession");
return String.valueOf(testSession);
}



