目录
什么是session
Session的工作原理
什么是会话
什么是cookie
cookie是web服务器端向我们客户端发送的一块小文件,该文件是干嘛的呢?是为了标记我们的客户端,目的是让服务器端能在客户端访问过该站点之后再次访问时认出你是那个那个客户端,之前也访问过服务器端,并有那些偏好设置,或者密码等等;
举例来说, 一个 Web 站点可能会为每一个访问者产生一个唯一的ID, 然后以 Cookie 文件的形式保存在每个用户的机器上。如果使用浏览器访问 Web, 会看到所有保存在硬盘上的 Cookie。在这个文件夹里每一个文件都是一个由“名/值”对组成的文本文件,另外还有一个文件保存有所有对应的 Web 站点的信息。在这里的每个 Cookie 文件都是一个简单而又普通的文本文件。透过文件名, 就可以看到是哪个 Web 站点在机器上放置了Cookie(当然站点信息在文件里也有保存) 。
所谓“cookie”数据是指某些网站为了辨别用户身份,储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
cookie的工作原理
(1)浏览器端第一次发送请求到服务器端
(2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
(3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
(4)服务器端通过Cookie中携带的数据区分不同的用户
什么是session
session代表着客户端和服务器端的一次会话过程,session对象中会存储此次会话中产生的一些属性和配置信;
Session的工作原理
(1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
(2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
(3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
如何name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie,如果name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象;
如果value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie,如果value为SessionId存在,返回session对象;
为什么会有session和cookie
说起来为什么需要 Cookie ,这就需要从浏览器开始说起,我们都知道浏览器是没有状态的(HTTP 协议无状态),这意味着浏览器并不知道是张三还是李四在和服务端打交道。这个时候就需要有一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作,那这套机制的实现就需要 Cookie 和 Session 的配合。
cookie和session如何配合工作
在用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
综上可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。
cookie和Session作用
我们都知道http协议是一种无状态的协议,一个普通的请求大致可以分为三步:
1、客户端将请求发送给服务器
2、服务器接收到请求并处理该请求
3、服务器将处理结果响应该客户端。
在完成以上请求步骤之后,该客户端再次向该服务器端发送请求,服务器端并不能知道这两个请求是否是由同一个浏览器或用户发出来的。所以作为web服务器必须能够采用某种方式来唯一标识同一个用户,并记录该用户的状态,以便下一次同一用户访问服务器端时我们可以识别出来。而同一个客户端与服务器端的在一段时间内的多次交互,我们就可以称该客户端为该服务器端的一个客户端会话窗口,有了会话窗口,我们就能确定哪个请求是哪个用户发出的了,从而可以实现会话跟踪,并记录用户的行为。
综上所述:session和cookie的作用都是为了记录用户的信息,实现识别用户,自动登录,显示购物车功能。不同之处在于session的主体在服务器上,体量大,cookie主体在客户端上,体量小。
什么是会话
在我们了解了cookie和Session的作用之后,我们会想到这个作用会使用到什么地方呢?
下文我们就聊一聊应用;
会话: 我们标记了访问浏览器端的用户身份信息后,我们就可以区分出不同的用户,此时我们将不同用户访打开浏览器,访问该web服务器的多个资源,然后关闭浏览器的这个过程称为一个会话;
有状态(标识)的会话:有了这个标识之后,浏览器发送的每一次请求,每一个会话都要有唯一的标识来唯一标识自己,当浏览器发送请求的时候就带上这个标识来让服务器识别,从而实现有“状态”(标识)的会话。
综上所述:cookie和Session就是实现会话两种的机制;
cookie的基本应用
这是我在网上粘贴的一段 cookie进行自动登录的服务器代码;
//如果cookie中有customer信息,就放到session中
boolean checkCustomerCookie(HttpServletRequest request) throws UnsupportedEncodingException {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
//如果有,解密后拿cookie中的值和数据库中的值进行比较
if (Constant.cookieCustomerKey.getName().equals(cookieName)){
String cookieValue = cookie.getValue();
String decry = EncrypUtils.Base64Util.decry(cookieValue);
Customer customer1 = JsonUtils.stringToObject(decry, Customer.class);
Customer customer2 = customerService.checkLogin(customer1.getPhoneNumber(), customer1.getPassword());
if (customer2 != null){
//放入到session中,放行
request.getSession().setAttribute("customer",customer2);
//自动登录时,更新用户的在线状态
Customer onlineCustomer = new Customer();
onlineCustomer.setId(customer2.getId());
onlineCustomer.setOnlineStatus(String.valueOf(Constant.ONLINESTATUS.getCode()));
customerService.updateById(onlineCustomer);
return true;
}
}
}
}
return false;
}
此笔记有一部分是我对网上资料的复制粘贴在加上自己的一些理解,作为笔记,仅用于自己日后复习;