You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spring-boot-online-exam/doc/references/JWT校验.md

5.0 KiB

JWT校验

参考教程

开发在线教育视频站点核心业务之JWT微服务下的用户登录权限校验

1、单机和分布式应用的登录检验讲解

简介讲解单机和分布式应用下登录校验session共享分布式缓存使用

登录校验方案

1.1、单机tomcat应用登录检验

单机tomcat应用登录检验

  • sesssion保存在浏览器和应用服务器会话之间
  • 用户登录成功服务端会保证一个session当然会给客户端一个sessionId
  • 客户端会把sessionId保存在cookie中每次请求都会携带这个sessionId

1.2、分布式应用中session共享

真实的应用不可能单节点部署所以就有个多节点登录session共享的问题需要解决

  • 1tomcat支持session共享但是有广播风暴用户量大的时候占用资源就严重不推荐 tomcat开启session共享

  • 2使用redis存储token

    服务端使用UUID生成随机64位或者128位token放入redis中然后返回给客户端并存储在cookie中用户每次访问都携带此token服务端去redis中校验是否有此用户即可

    使用redis存储token

2、微服务下登录检验解决方案 JWT讲解

简介:微服务下登录检验解决方案 JWT讲解 json wen token

JWT概要

2.1、JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。

JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名

简单来说就是通过一定规范来生成token然后可以通过解密算法逆向解密token这样就可以获取用户信息

{
    "id":888,
    "name":"小D",
    "expire":10000
}
funtion 加密(object, appsecret){
    xxxx
    return base64( token);
}
function 解密(token ,appsecret){
    xxxx
    //成功返回true,失败返回false
}
  • 优点:
    • 1生产的token可以包含基本信息比如id、用户昵称、头像等信息避免再次查库
    • 2存储在客户端不占用服务端的内存资源
  • 缺点:
    • token是经过base64编码所以可以解码因此token加密前的对象不应该包含敏感信息如用户权限密码等

2.2、JWT格式组成 头部、负载、签名

header+payload+signature

  • 头部:主要是描述签名算法
  • 负载主要描述是加密对象的信息如用户的id等也可以加些规范里面的东西如iss签发者exp 过期时间sub 面向的用户
  • 签名主要是把前面两部分进行加密防止别人拿到token进行base解密后篡改token

JWT概要

2.3、关于jwt客户端存储

可以存储在cookielocalstorage和sessionStorage里面

3、登录检验JWT实战之封装通用方法

讲解引入相关依赖并开发JWT工具类

3.11、加入相关依赖

<!-- JWT相关 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

3.2、开发生产token方法

3.3、开发检验token方法

4、Springboot2.x用户登录拦截器开发实战

简介:实战开发用户登录拦截器拦截器 LoginInterceptor

4.1、实现接口 LoginInterceptor implements HandlerInterceptor

4.2、重写preHandler

String accessToken = request.getHeader("token");
if(accessToken == null){
    accessToken = request.getParameter("token");
}
if (accessToken != null ) {
    Claims claims = JWTUtils.checkJWT(accessToken);
    Integer id = (Integer)claims.get("id");
    String  name = (String)claims.get("name");
    request.setAttribute("user_id",id);
    request.setAttribute("name",name);
    //普通用户
    return true;
}
return false;

4.3、配置拦截器

@Configuration
InterceptorConfig implements WebMvcConfigurer

@Override
public void addInterceptors(InterceptorRegistry registry) {

    registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/api/v1/*/**");

    WebMvcConfigurer.super.addInterceptors(registry);
}

4.4、响应前端数据

public static void sendJsonMessage(HttpServletResponse response, Object obj) throws Exception {
    Gson g = new Gson();
    response.setContentType("application/json; charset=utf-8");
    PrintWriter writer = response.getWriter();
    writer.print(g.toJson(obj));
    writer.close();
    response.flushBuffer();
}