古典风格网站源码/东莞网络推广及优化
目录
什么是会话?
会话跟踪
为什么要在同一次会话的多次请求共享数据?
方式一:Cookie
HttpServletResponse
方式二:Session
JWT令牌
JWT令牌由哪几个部分组成?
优点:
生成Jwt令牌
Jwts.builder();构建一个JWT令牌
.signWith指定签名算法
.addClaims()添加自定义信息
.put()往Jtw令牌中存储信息
.setExpiration()指定有效期
.compact()生成令牌
.setSigningKey设置密钥
.parseClaimsJws()解析传进来的Jwt令牌
.getBody();获取自定义信息
什么是会话?
在web开发中,会话指的是浏览器与服务器之间的一次连接,我们称为一次会话。
会话跟踪
服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
为什么要在同一次会话的多次请求共享数据?
登录的过程中有验证码,这个验证码是请求服务器端动态生成的,所以前端要想呈现出这个验证码,此时要发送请求给服务器端,服务器端生成一个验证码后,再将这个验证码图片响应给前端,前端再将其展示出来,这次请求完成后会话就建立了,然后输入用户名密码和验证码后就可以点击登录,当点击登录按钮的时候又要发送第二次请求,那这次请求的就是登录接口,在服务器端依然要校验验证码的正确性,而正确的验证码是上一次请求生成的,那上一次生成的验证码之后它会把这个验证码记下来,然后在登录的过程中会将页面传递的验证码和正确的验证码进行比对,如果页面传递的验证码和上一次请求的验证码是一致的,这个时候就代表这个验证码是正确的
第一次请求需要记录验证码的值是多少,而第二次发起登录请求的时候,它又要去获取上一次登录请求的这个数据,这个时候就要在同一次会话的多次请求之间共享数据了,那就可以通过会话跟踪技术解决这个问题
会话跟踪技术有两种
方式一:Cookie
cookie是客户端会话跟踪技术,它是存储在客户端浏览器的,
当我们在浏览器端直接访问登录这个接口时,如果所传递的用户名和密码都是正确的,此时就可以成功登录,登录成功后我们就可以在服务器端创建这么个Cookie对象,然后将多次请求之间需要共享的数据存储在Cookie中,比如在Cookie中存储当前用户存储成功的标识,然后紧接着就可以给前端响应数据了,而在响应数据的时候,这个Cookie会自动的响应给浏览器,而浏览器接受这个Cookie后,浏览器会自动的把这个Cookie存储在本地,并且在之后的每一次请求中,都会将这个Cookie自动的携带到服务器端,服务器端拦截到前端所发起的请求后就可以获取到Cookie中存储的数据了,然后去校验这个用户的登录信息是否存在,如果这个用户已经登录了,我们就直接放行,让它去访问对应的资源,如果携带过来的Cookie并没有存储用户的信息,就直接给前端响应一个错误的结果,那他去登录就可以了,这就是基于Cookie对话的流程
那为什么一切都是自动的呢?
Cookie虽然不是http协议的一部分,但是在http协议中对Cookie提供了支持,提供了两个头,一个是响应头,一个是请求头,当我们在服务器端给前端响应Cookie的时候,最终会自动的在响应头中添加(Set-Cookie)告诉浏览器我们要设置Cookie了,Cookie里面存储的数字形式就是Key=value,紧接着浏览器接收到相应回来的数据之后,一旦发现有个(Set-Cookie)的响应头,它就将这个Cookie自动的保存到浏览器本地,并且在之后的每一次请求后,它都会将浏览器保存的Cookie携带到服务器端
因为在HTTP协议中又提供了另外一个请求头,这个请求头叫Cookie,在Cookie这个请求头中,它就会自动的将当前浏览器所保存的Cookie数据一并携带到服务器端,服务器端就可以获取到请求头传来的Cookie,然后去校验当前Cookie是否存储当前登录的用户信息,这就是Cookie的优点,它是HTTP协议中所提供的两个技术,一个相应头,一个请求头
HttpServletResponse
HttpServletResponse服务器对客户端的 HTTP 响应
方式二:Session
是服务器端会话跟踪技术,所以是存储在服务器端的。
浏览器在第一次请求服务器的时候,我们就可以直接在服务器当中来获取到会话对象Session。如果是第一次请求Session ,会话对象是不存在的,这个时候服务器会自动的创建一个会话对象Session 。而每一个会话对象Session ,它都有一个ID(示意图中Session后面括号中的1,就表示ID),我们称之为 Session 的ID。
接下来,服务器端在给浏览器响应数据的时候,它会将 Session 的 ID 通过 Cookie 响应给浏览器。其实在响应头当中增加了一个 Set-Cookie 响应头。这个 Set-Cookie 响应头对应的值是不是cookie? cookie 的名字是固定的 JSESSIONID 代表的服务器端会话对象 Session 的 ID。它会在响应头Set-Cookie中,将服务器端当前会话对象Session的id值一并返回给浏览器,浏览器会自动识别这个响应头,然后自动将Cookie存储在浏览器本地。
接下来,在后续的每一次请求当中,都会将 Cookie 的数据获取出来,并且携带到服务端。接下来服务器拿到JSESSIONID这个 Cookie 的值,也就是 Session 的ID,是Session会话的唯一标识。那就可以根据这个标识找到对应的Session会话对象,然后再从会话对象中获取到我们之前存储的信息
JWT令牌
令牌就相当于是用户合法的身份凭证,其本质就是一个字符串
JWT令牌由哪几个部分组成?
- header(头):记录令牌类型,标签算法
- payload(载荷):携带一些自定义的信息,有些一些令牌的默认信息,比如令牌的有效期
- signature(签名):防止被篡改,保证安全性
header()和payload()原始格式的数据是json格式的数据,是对json格式的数据进行了base64编码,而签名并不是64编码,它是基于一定的签名算法计算出来的加密之后的字符串
优点:
- 支持pc端,支持移动端,还支持小程序端
- 可以解决集群环境下的认证问题
- 基于Session这种方案在集群环境下无法使用,因为Session这种方案是我们需要将会话信息保存到服务器端的,对于令牌这种方案是不需要在服务器端保存任何信息的,所以它可以解决集群环境下的认证问题
- 减轻了服务器端存储压力
生成Jwt令牌
Jwts.builder();构建一个JWT令牌
.signWith指定签名算法
第一个参数指定签名算法,第二个指定密钥
第一个参数内容打开官方文档显示对应的签名算法:JSON Web Tokens - jwt.io
第二次参数指定字符串进行Base64编码,网址:Base64 编码/解码 - 锤子在线工具
.addClaims()添加自定义信息
.put()往Jtw令牌中存储信息
username叫admin
.setExpiration()指定有效期
System.currentTimeMills()获取当前时间信息的毫秒值
.compact()生成令牌
.parser解析Jwt令牌
而在解析令牌的时候,我们需要密钥,没有密钥是没法解析令牌的
.setSigningKey设置密钥
生成令牌和解析令牌时的密钥要完全一致
.parseClaimsJws()解析传进来的Jwt令牌
.getBody();获取自定义信息
测试结果,exp是过期时间