当前位置: 首页 > article >正文

基于springboot的登录校验

🔥基于springboot的登录校验🔥

文章目录

  • 🔥基于springboot的登录校验🔥
    • 1. JWT令牌
    • 2. 过滤器Filter
    • 3. 拦截器Interceptor

🚀 开篇寄语:
还在为Spring Boot项目的登录校验而一筹莫展吗?本篇实战教程将是你破解这一难题的钥匙,从JWT令牌的生成与解析,到过滤器与拦截器的巧妙运用,我们将一步步揭开Spring Boot登录校验的神秘面纱,让你的项目安全性瞬间提升!

📖 精彩预告:

JWT令牌实战: 深入剖析JWT令牌的结构与原理,教你如何轻松生成与解析令牌,实现高效安全的登录认证。
过滤器Filter详解: 过滤器在Spring Boot中的强大作用,如何配置过滤器实现登录校验等特殊功能。
拦截器Interceptor应用: 拦截器的定义与配置,以及在登录校验中的实战应用,让你的项目更加灵活可控。

💡 为什么值得一读:

本篇教程不仅涵盖了Spring Boot登录校验的核心知识点,更通过实战案例让你深入理解每个细节。
无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的经验与启示。通过本篇教程的学习,你将能够轻松应对Spring Boot项目中的登录校验问题,提升项目的安全性与可靠性。

1. JWT令牌

场景:登录认证

① 登录成功后,生成令牌

② 后续每个请求,都要携带JWT令牌,系统每次处理请求前,先进行令牌校验,通过后再处理请求

在这里插入图片描述

组成描述例子
Header(头)记录令牌类型、签名算法等{“alg”:“HS256”, “type”: “JWT”}
Payload(有效载荷)携带自定义信息{“id”:“1”, “username”: “tom”}
Signature(签名)防止token被串改由header+payload+密钥+签名算法

pom.xml依赖

<dependency>
	<groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

创建Jwt令牌

  public void creatJwt(){
        //定义map集合来封装自定义数据
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", 1);
        claims.put("username", "tom");
        String jwt = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS256, "秘钥")
                .setExpiration(new Date(System.currentTimeMillis() + 3600*1000))//设置JWT令牌有效期 -> 1h
                .compact();
        System.out.println(jwt);
    }

解析Jwt令牌

public void ParseJwt(){
    Claims claims = Jwts.parser()
            .setSigningKey("秘钥")
            .parseClaimsJws("Jwt令牌字符串")  //Jwt令牌字符串
            .getBody();  //拿到第二部分内容
    //输出解析的Jwt令牌内容
    System.out.println(claims);//{name=tom, id=1, exp=1732194534}
}

Jwt令牌工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    private static String signKey = "itheima";
    private static Long expire = 43200000L;
    public static String creatJwt(Map<String, Object> claims) {
        claims.put("id", 1);
        claims.put("username", "tom");
        String jwt = Jwts.builder()
                .setClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis() + expire))//设置JWT令牌有效期 -> 1h
                .compact();
        return jwt;
    }

    public static Claims ParseJwt(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(signKey)  //给予前面自己生成JWT令牌所设置的签名秘钥才可以解析JWT令牌
                .parseClaimsJws(jwt)  //Jwt令牌字符串
                .getBody();  //拿到第二部分内容
        //输出解析的Jwt令牌内容
        return claims;
    }
}

2. 过滤器Filter

过滤器可以把请求拦截下来,实现一些特殊功能:登录校验,敏感字符处理等

在这里插入图片描述

  1. 定义Filter: 定义一个类,实现Filter接口
  2. 配置Filter: Filter类上加@WebFilter注解,配置拦截资源的路径,引导类上加@ServeletComponentScan开启对Servlet组件支持。
@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("拦截到了请求:放行前的逻辑");
        //放行
        chain.doFilter(request, response);
        System.out.println("拦截到了请求:放行后的逻辑");
    }
}
@ServletComponentScan
@SpringBootApplication
public class SpringbootWebMyprojectApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebMyprojectApplication.class, args);
    }
}

Filter的应用:
在这里插入图片描述

代码:

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 1.获取请求url
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}", url);
        
         // 2.判断url是否包含login,如果包含为登录操作,放行
        if(url.contains("login")){
            log.info("登录操作,放行...");
            chain.doFilter(request,response);
            return;
        }

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

        // 4.判断令牌是否存在,不存在返回错误
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        // 5.解析JWT,解析失败返回错误
        try {
            JwtUtil.parseJwt(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回错误信息");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        // 6.放行
        log.info("令牌合法");
        chain.doFilter(request,response);
    }
}

3. 拦截器Interceptor

在这里插入图片描述

  1. 定义拦截器: 实现HandlerInterceptor接口
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override//目标资源方法执行前运行  // 目标资源方法执行前运行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行前preHandle");
        return true;
    }

    @Override//目标资源方法执行后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行后postHandle");
    }

    @Override//视图渲染完毕后运行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("渲染完毕afterCompletion");
    }
}
  1. **配置拦截器:**定义配置类,实现WebMvcConfigurer接口
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}
  1. 拦截器-拦截路径:

在这里插入图片描述

  1. 拦截器-执行流程

在这里插入图片描述

  1. 登录校验

在这里插入图片描述

@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override//目标资源方法执行前运行  // 目标资源方法执行前运行
    public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
        // 1.获取请求url
        String url = req.getRequestURL().toString();
        log.info("请求的url:{}", url);

        // 2.判断url是否包含login,如果包含为登录操作,放行
        if(url.contains("login")){
            log.info("登录操作,放行...");
            return true;
        }

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

        // 4.判断令牌是否存在,不存在返回错误
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头token为空,返回未登录");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

        // 5.解析JWT,解析失败返回错误
        try {
            JwtUtil.parseJwt(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回错误信息");
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return false;
        }

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

    @Override//目标资源方法执行后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("执行后postHandle");
    }

    @Override//视图渲染完毕后运行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("渲染完毕afterCompletion");
    }
}
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}
@Configuration //配置类
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

🔥 结语:

通过本篇教程的学习,相信你已经对Spring Boot的登录校验有了深入的理解与掌握。
无论是JWT令牌的使用,还是过滤器与拦截器的配置,都将成为你项目中不可或缺的安全利器。
希望本篇教程能够对你的学习与工作有所帮助,让你的SpringBoot项目更加安全、高效!


http://www.kler.cn/a/413768.html

相关文章:

  • 如何解决 java.rmi.NotBoundException: RMI 中没有绑定的对象问题?亲测有效的解决方法!
  • Web会话安全测试
  • 【PyTorch】(基础一)----pytorch环境搭建
  • 【Threejs进阶教程-着色器篇】9.顶点着色器入门
  • 浅谈Java库之‌Guava
  • 【详细介绍及演示】Flink之checkpoint检查点的使用
  • 通信网络安全
  • Java对象与XML互相转换(xstream)
  • 本地化部署 私有化大语言模型
  • ABAP OOALV模板
  • Android中ByteBuffer内存池设计示例
  • 23种设计模式之外观模式
  • linux添加附加磁盘
  • CFD 在生物反应器放大过程中的作用
  • 拍立淘按图搜索实战化,拍立淘API接口参数说明
  • 在 Ubuntu 上部署 MediaWiki 开源维基平台
  • Jetpack业务架构(ViewModel)
  • Linux系统之iotop命令的基本使用
  • 【EI会议征稿通知 | 往届均已见刊检索】第四届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2025)
  • 分类预测 | Matlab实现GA-XGBoost分类预测
  • 使用Eureka实现服务注册与发现的具体案例详解
  • go语言怎么实现bash cmd里的mv功能?
  • 【GPT】力量训练是什么,必要吗,有可以替代的方式吗
  • 11.25 Scala案例
  • web3.js + Ganache 模拟以太坊账户间转账
  • Ubuntu 硬盘分区并挂载