JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它由三部分组成:头部(header)、载荷(payload)和签名(signature)。JWT令牌通常用于在用户和服务器之间进行身份验证和授权。
JWT令牌的工作流程如下:
- 用户通过用户名和密码进行登录操作,服务器验证用户身份后(即登录成功)会生成一个JWT令牌。
- 服务器将JWT令牌返回给用户,用户将其存储在本地。
- 用户在后续的任何请求中都会将JWT令牌发送给服务器。
- 服务器验证JWT令牌的签名和有效期,并根据载荷中的信息进行相应的操作。
JWT令牌的优点包括:
- 简单轻量:JWT令牌是基于JSON格式的,易于传输和解析。
- 安全性:JWT令牌使用签名进行验证,可以防止篡改和伪造。
- 无状态性:JWT令牌包含了所有必要的信息,服务器无需保存用户的会话状态
1.添加令牌依赖
要想使用JWT令牌,需要在pom.xml 文件中添加对应的依赖
2.定义令牌生成和解析方法
如果用户进行登录操作,登录成功后,服务器会调用令牌生成方法,给用户生成一个令牌,然后将令牌返回给用户端,用户端就会把令牌存储到本地,之后用户发送任何请求都会在请求体中携带令牌。而用户发起的任何请求都会被服务器的过滤器所拦截,在过滤器中校验令牌的真假,如果令牌正确,则放行用户的请求,如果令牌错误,则返回给用户端提示信息
2.1 定义令牌工具类
生成一个 JWT令牌需要设置令牌的加密算法、密钥、有效时期,也可以在令牌中添加一些自定义的内容,而自定义的内容会被添加到令牌的载荷(payload)部分里
所以我们定义两个静态变量。第一个变量设置密钥,第一个变量设置有效时期
2.2 定义令牌生成方法
定义一个方法用来生成令牌,我们自定义的内容可以通过参数传递到方法中,然后在方法中设置令牌所需要的东西,最后该方法返回一个字符串的 JWT令牌
2.3定义令牌解析方法
令牌解析是用于校验令牌的真假性。在用户进行任何操作之前,会先验证令牌的真假,只有令牌为真,才能继续操作
校验令牌需要我们把之前生成的令牌作为参数传进去,还需要设置生成令牌时所用的密钥,最后该方法返回的是令牌的载荷(payload)部分,所就是我们自定义的内容
3.在登录功能中调用令牌生成方法
只有用户登录成功后,才会生成令牌,如果用户登录失败,则会提示失败信息
当服务端接收到登录请求后,先获取用户登录时所输入的账号和密码,封装到用户实体类中。然后调用业务层中的方法,查询该账号密码是否在数据库中存在,如果存在则证明用户输入的账号密码正确
然后可以定义一个集合,将用户的信息添加到集合里面
然后调用令牌生成方法,将集合作为参数传进去,最终集合里的信息会被添加到令牌的载荷(payload)部分里面
最后将令牌添加到返回体中,返回给用户端一个成功的JSON 数据。如果登录失败,则最后返回给用户端一个失败的JSON 数据
4.定义过滤器
服务器给用户生成令牌之后,往后用户所有的请求中都会在请求体中携带令牌。而用户发起的请求都会被过滤器所拦截,在过滤器中校验令牌的真假和令牌的有效期,如果通过校验,则放行用户的请求
定义一个过滤器,实现 Filter 接口,并在注解上添加拦截所有路径请求,重新 Filter 接口里的一个放行方法
然后还需要在启动类上添加一个注解
@ServletComponentScan
用于扫描我们定义的过滤器类
5.定义令牌校验条件
在过滤器中,定义一些令牌的校验条件,如果条件全都满足,则校验通过,放行用户的请求。如果校验失败,则返回失败的响应体
5.1 转换数据类型
先把请求和响应分别转换成
HttpServletRequest 类型
HttpServletResponse 类型
2.获取请求的url
判断 url 中是否包含 login 路径,如果包含,则证明该请求是用户登录请求,因为在登录之前还没有生成令牌,所有直接放行
3.获取请求头中的令牌
如果令牌为空,则返回给用户端错误的 JSON 数据
如果令牌不为空,则校验令牌的正确性,需要调用令牌工具类中解析令牌的方法,如果解析失败,则抛异常,返回给用户端错误的 JSON 数据
如果解析正确,则放行