登录校验-Filter

文章详细介绍了如何使用JWT进行登录校验。当用户登录成功后,服务器生成JWT令牌并返回给前端。前端在后续每个请求中携带此令牌,过滤器检查请求头中的JWT令牌,对非登录请求进行权限校验。若令牌不存在或解析失败,则返回未登录错误。反之则放行请求执行业务操作。
摘要由CSDN通过智能技术生成
  • 上一篇介绍完了基础应用和细节,现在来完成登录校验功能
  • 基本流程:
    • 要进入后台管理系统,必须完成登录操作,此时就需要访问登录接口Login。
    • 登录成功服务端会生成一个JWT令牌,并且返回给前端,前端会将JWT令牌存储下来。
    • 在后续每次请求中,都会将JWT令牌携带到服务端,请求到达服务端要想访问对应的业务功能就必须校验令牌的有效性。
    • 登录校验的过滤器,在过滤期中校验令牌的有效性。如果令牌无效就响应错误信息,不会再去放行访问的对应资源。如果令牌存在并且有效,此时就会放行访问对应的web资源,执行响应的业务操作。
  • 在开发之前明确两个问题?
    • 所有的请求拦截到以后,都需要校验令牌吗?
      • 登陆请求例外
    • 拦截到请求之后,什么情况下才可以放行,执行业务操作?
      • 有令牌,并且校验通过,否则返回未登录错误的错误结果
  • 先画一张流程图:

  • 备注说明:
    • 用户登录成功后,系统自动下发JWT令牌,然后在后续每次请求中,都需要在请求头header中携带到服务端,请求头的名称为token,值为登录下发的JWT令牌。
  • 废话不多说咱们直接上代码:
    • @Slf4j
      @WebFilter(urlPatterns = "/*") //拦截所有请求
      public class LoginCheckFilter implements Filter {
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
              //前置:强制转换为http协议的请求对象、响应对象 (转换原因:要使用子类中特有方法)
              HttpServletRequest request = (HttpServletRequest) servletRequest;
              HttpServletResponse response = (HttpServletResponse) servletResponse;
      
              //1.获取请求url
              String url = request.getRequestURL().toString();
              log.info("请求路径:{}", url); //请求路径:http://localhost:8080/login
      
      
              //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
              if(url.contains("/login")){
                  chain.doFilter(request, response);//放行请求
                  return;//结束当前方法的执行
              }
      
      
              //3.获取请求头中的令牌(token)
              String token = request.getHeader("token");
              log.info("从请求头中获取的令牌:{}",token);
      
      
              //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
              if(!StringUtils.hasLength(token)){
                  log.info("Token不存在");
      
                  Result responseResult = Result.error("NOT_LOGIN");
                  //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
                  String json = JSONObject.toJSONString(responseResult);
                  response.setContentType("application/json;charset=utf-8");
                  //响应
                  response.getWriter().write(json);
      
                  return;
              }
      
              //5.解析token,如果解析失败,返回错误结果(未登录)
              try {
                  JwtUtils.parseJWT(token);
              }catch (Exception e){
                  log.info("令牌解析失败!");
      
                  Result responseResult = Result.error("NOT_LOGIN");
                  //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
                  String json = JSONObject.toJSONString(responseResult);
                  response.setContentType("application/json;charset=utf-8");
                  //响应
                  response.getWriter().write(json);
      
                  return;
              }
      
      
              //6.放行
              chain.doFilter(request, response);
      
          }
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值