web-会话id

366 阅读3分钟

背景

会话的本质作用是要区分不同的用户。

会话的解决方法,核心是怎么在客户端和服务器传数据,这个数据就是会话id。


按应用场景分 1.前后端不分离 //浏览器和服务器内置会话id字段,对程序员透明 2.前后端分离 //基于token。这里的token和会话id字段是等同的。唯一的区别是,客户端每次要发送,服务器每次要接受。其实,会话id也是每次发送和每次接受,只不过不需要是由浏览器和服务器自动完成。

前后端不分离

管理系统,基于会话。

思路,第一次登陆,验证成功。第二次访问,怎么知道有没有登陆?拦截器。

第一次,拦截。

第二次,仍然会拦截。

也就是说,每次都拦截,每次都判断,只不过拦截功能是由拦截器统一处理的。

思路,有两种解决方法。

一种是,每次验证用户名和密码。即,前端每次输入用户名和密码,后台每次验证。

一种是,第一次登陆的时候,验证成功,并且设置数据到会话里。

然后下次访问的时候,仍然会拦截,只不过拦截的时候,不是每次验证用户名和密码,而是验证会话里是否有user数据,有就是登陆成功,没有就是没有登陆。

退出,就是删除会话数据。


拦截器业务逻辑 每次都会拦截,然后验证会话数据,第一次,没有会话数据,那么登陆;第二次,有会话数据,那么访问资源。

会话的本质

先设置会话数据,user/user。 然后读会话数据,user/user。

为什么不同的用户,读的数据可以区分不同用户?因为会话的会话id。

这个是由浏览器和tomcat自动维护的,对程序员透明。

所以,每次读相同的user对象,这个问题已经解决了,核心技术就是基于会话机制,浏览器和tomcat都支持会话机制,而且必须同时支持。


会话的本质有两点,一个是服务器为每个用户存储了数据,一个是如何区分不同的用户。

其中,第一点,存储数据,这个完全是服务器实现的。

最最重要的是如何区分用户?BS是基于会话id,即每次请求会自动携带会话id字段,debug模式请求头可以看到SESSIONID这个字段。

也就是说,如果客户端是浏览器的话,浏览器已经实现了会话id机制,tomcat也实现了会话id机制,对程序员透明。

如果客户端是其他程序,比如app,那么就需要我们自己实现会话id,所谓的实现会话id,其实就是在每次请求的时候多输入一个字段而已,这一点和浏览器的会话id本质上是一模一样的,唯一的区别就是浏览器帮你实现了,不需要写任何代码,而程序员自己实现需要写代码。

前后端分离

如何输入会话id?也是每次请求都要输出。和app一样。即需要程序员自己处理唯一用户的问题。

前后端分离-app

app,是基于token。

token位于请求头。

token的生成规则

核心是要唯一。

总结

BS和app,都是基于会话id。只不过app是叫token,而浏览器是叫会话id,本质都是一个唯一的字符串。

请求数据

请求头 请求体 //请求数据

保持登陆和保持会话的区别?

都是基于会话id字段来实现的。

但是,保持登陆也可以使用别的解决方法实现。比如springboot里的权限控制。