如何让Java项目兼容更多的客户端设备(一)
引入
HTTP访问是无状态的,(服务器不知道是不是你访问的)所以我们不知道每次登录的是谁
如果想实现每次登录不用重复登录,最简单的就是让浏览器记住用户名和密码。但这样做风险极大,如果电脑被黑了就会泄露出去密码;而且每次浏览器都要想办法在请求里加入用户名和密码
cookie:让HTTP请求都自动带数据给服务器的技术
cookie基本流程
浏览器发送一个HTTP请求过去后,第一次cookie是空的,然后服务器会set cookie里两个重要的值name 和 value并发送回去,这样浏览器每次访问这个网站的时候把cookie带过去即可。
说白了Cookie就是一种存储在浏览器的数据而已。打开浏览器就可以看到保存了那些的Cookie的,只要电脑被黑在cookie里的重要信息就很容易被泄露。
Cookie的核心特点:每个请求,都会自动发送Cookie到相应的服务器那里
Session (会话)
浏览器和服务器是在进行会话的,浏览器访问服务器就是会话的开始,但关掉网页并不一定会话的结束。(比如你很可能误触)因此不同的网站对每个用户的会话都设定了时间(会话的结束时间)和唯一的ID(Session ID)这是服务器自己定义的东西,所以一般会保存在数据库里面。
Session ID是没有规律的字符串,之所以不是用用户名而是Session ID就是出于安全考虑。而且服务器在发送Cookie之前是会对这个含有Session ID的Cookie进行签名,如果黑客修改了ID,其就会变成服务器识别不了的字符串。
会话的结束,等Cookie的有效期结束后,浏览器一般会自行删除这个Cookie。失效后就要重新输入用户名和密码了
JSON Web Token
- 引入
当用户量过大的时候,服务器就会面临可能需要存储大量的ID在服务器里,如果有多台服务器,一台服务器存储了ID后就要分享ID给其他服务器(避免超载)。但是如果更多的话就要让数据库存储ID了,但如果数据库崩溃了,又会影响服务器获取Session ID.
- 过程
浏览器把JWT以Cooike或者Storage的形式进行存储
这和Session很类似,只不过Token存储在用户那边了
服务器不需要存储,服务器只管签发和验证,所有人的签名都是一个 只要存一个就行了
换句话说,jwt是不用放内存的,session是要在内存的,节省了内存
这样服务器就不需要存储凭证了 跟session不一样,jwt只存储在客户端
sion是要在内存的,节省了内存**
这样服务器就不需要存储凭证了 跟session不一样,jwt只存储在客户端
相当于服务器只存储了一个解密工具,浏览器把信息加密发送给客户端,然后服务器收到请求再通过解密看服务器保存的密码是否配对解密出来的密码