AI大模型教程
一起来学习

初步认识JWT,过滤器与拦截器

JWT:

1.定义:

JSON Web Token ==> 是一种基于JSON的开放标准用于在各方之间安全传输信息,优于Cookie与Session;

  1. Cookie:客户端会话技术 -> 缺点:APP不能用,不能跨域
  2. Session:服务端会话技术,底层基于Cookie -> 分布式环境Session不能共享,会损耗服务器内存

2.组成部分:

由三部分组成:头、载荷、签名;

  1. Header:指定令牌类型和签名算法(如{"alg": "HS256", "typ": "JWT"}
  2. Payload:携带实际数据(如用户ID、权限、过期时间)
  3. Signature:对前两部分的签名,用于验证完整性

3.作用:

  1. 身份认证:用户登录后服务器生成JWT,客户端后续请求携带该令牌
  2. 安全传输:签名机制防止数据篡改
  3. 无状态会话:服务端无需存储会话信息(减轻服务器压力)
  4. 跨域支持:适用于前后端分离架构和微服务间通信

过滤器Filter

地位:

WEB的三大规范接口之一:servlet、Filter、Listener

实现步骤:

1.创建一个类,实现Filter接口,重写抽象方法

2.在类上标记@WebFilter(“要拦截的路径”)

3.启动类加@ServletComponentScan

@WebFilter(urlPatterns = "/*")
public class AuthorizedFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //1.获取请求路径
        String uri = request.getServletPath();
        //2.判断当前请求路径是否为登录接口
        //3.是就直接放行
        if ("/login".equals(uri)) {
            chain.doFilter(request, response);
            return;
        }
        //4.不是,获取token
        String token = request.getHeader("token");
        //5.判断token是否为空
        if (StrUtil.isBlank(token)) {
            response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
            return;
        }
        //6.不为空,解析token
        try {
            Claims claims = JwtUtils.parseJWT(token);
            Object id = claims.get("id");
            System.out.println(id);
            chain.doFilter(request, response);
        }catch (Exception e){
            response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
        }
    }
}

执行流程;

过滤前的代码 –> 放行 –> 过滤后的代码

拦截器Interceptor

成分:

Spring的组件,要实现HandlerInterceptor接口

实现步骤:

1.创建一个类实现HandlerInterceptor接口,重写抽象方法;

2.将拦截器交给spring管理

3.增加一个配置类,实现WebMvcConfigurer,重写addIntercepotr,在内部注册拦截器

@Component
@Slf4j
public class AuthorizedInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1. 获取请求url。
        String url = request.getRequestURL().toString();

        //2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
        if (url.contains("login")) { //登录请求
            log.info("登录请求 , 直接放行");
            return true;
        }

        //3. 获取请求头中的令牌(token)。
        String jwt = request.getHeader("token");

        //4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
        if (!StringUtils.hasLength(jwt)) { //jwt为空
            log.info("获取到jwt令牌为空, 返回错误结果");
            response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
            return false;
        }

        //5. 解析token,如果解析失败,返回错误结果(未登录)。
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败, 返回错误结果");
            response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
            return false;
        }

        //6. 放行。
        log.info("令牌合法, 放行");
        return true;
    }
}

执行流程:

preHandle 方法中的 —> 放行(目标资源)—> postHandle方法 —> afterCompletion方法

文章来源于互联网:初步认识JWT,过滤器与拦截器

相关推荐: 开源项目使用教程:Stable Diffusion v 2.1 web UI

开源项目使用教程:Stable Diffusion v 2.1 web UI stable-diffusion-2-gui Lightweight Stable Diffusion v 2.1 web UI: txt2img, img2img, depth2i…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » 初步认识JWT,过滤器与拦截器
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们