SpringBoot + JWT 打造无状态登录系统,让你的应用更安全高效

createh52个月前 (05-08)技术教程24

还在为Session共享烦恼?每次集群部署都要头疼用户状态同步?传统Cookie+Session模式在分布式场景下越来越力不从心?本文将手把手带你用SpringBoot+JWT实现无状态登录,轻松解决分布式认证难题,代码可直接移植到你的项目!


一、为什么选择JWT?传统Session的致命缺陷

传统Session的问题

  • 服务端存储压力大,用户量激增时内存崩溃
  • 集群环境下需要Session共享,增加架构复杂度
  • CSRF攻击风险高,安全性难以保障

JWT优势

  • 无状态:Token自包含用户信息,服务端无需存储
  • 跨域支持:轻松解决分布式系统认证
  • 安全性强:数字签名防篡改,可选择加密算法

二、JWT核心原理图解

Token组成

Header(算法类型) 
Payload(携带数据)
Signature(签名哈希)

Base64编码后组合:xxxxx.yyyyy.zzzzz

工作流程

  1. 用户登录成功后生成JWT
  2. 客户端存储Token(LocalStorage/Header)
  3. 每次请求携带Token进行身份验证

三、SpringBoot整合JWT实战(代码可复用)

1 添加依赖

xml

<!-- JWT支持 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

2 编写JWT工具类

java

public class JwtUtils {
    private static final String SECRET_KEY = "your-256-bit-secret"; // 实际项目从配置读取
    private static final long EXPIRATION = 86400000; // 24小时

    // 生成Token
    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 解析验证Token
    public static Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

3 实现登录拦截器

java

public class JwtInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) {
        String token = request.getHeader("Authorization");
        try {
            Claims claims = JwtUtils.parseToken(token);
            request.setAttribute("username", claims.getSubject());
            return true;
        } catch (Exception e) {
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
    }
}

4 配置拦截规则

java

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new JwtInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

5 编写登录接口

java

@RestController
@RequestMapping("/api")
public class AuthController {
    
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {
        // 1. 验证用户名密码(示例代码,实际需查数据库)
        if(!"admin".equals(request.getUsername()) || !"123456".equals(request.getPassword())){
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
        
        // 2. 生成Token
        String token = JwtUtils.generateToken(request.getUsername());
        return ResponseEntity.ok().header("Authorization", token).build();
    }
}

四、接口测试(Postman实战演示)

登录请求

bash

POST /api/login
Body: {"username":"admin","password":"123456"}
Response Header中获取Authorization

访问受保护接口

bash

GET /api/userInfo
Header添加:Authorization: Bearer <your_token>

五、生产环境优化建议

  1. 密钥管理:使用HS512算法,密钥存储在配置中心
  2. Token刷新:通过Refresh Token机制延长有效期
  3. 黑名单处理:实现登出功能时记录失效Token
  4. 安全增强:结合Spring Security做权限控制

结语

通过本文,你已经掌握了SpringBoot整合JWT的核心方法!无状态认证不仅能提升系统性能,更为微服务架构打下坚实基础。如果对你有帮助,欢迎:

点赞支持 | 收藏备用 | 关注获取更多技术干货

相关文章

Java 自定义注解在登录验证的应用

java注解从 JDK 5开始,Java 增加了注解的新功能,注解其实是代码里面的特殊标记,这些标记可以在编译、类加载和运行时被读取,在不改变代码原有逻辑下,给源文件嵌入注解信息。再通过返回获取注解信...

学习笔记-CAS实现单点登录(单点登录 cas oauth2)

CAS企业单点登录-v5.3.x单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS框架:CAS(Central...

Java登录暗藏玄机!5年开发老鸟揭秘7大安全漏洞—附终极防御方案

“你的用户密码真的安全吗?80%的Java开发者都踩过这些坑!悟空问答特邀资深架构师,用外卖系统等生活案例,教你写出支付宝级别的登录系统!”一、灵魂拷问:记住我功能=记住危险?用户提问:“为什么我用C...

Spring Boot3 扫码登录实现全解析:从基础到实战

登录环节作为用户与应用交互的第一步,其便捷性和安全性备受关注。扫码登录以其高效、便捷的特性,正逐渐成为众多应用的标配。对于后端开发人员而言,在 Spring Boot3 框架下实现扫码登录,既充满挑战...

使用 Sa-Token 实现不同的登录:单地登录、多地登录、同端互斥登录

一、需求分析如果你经常使用腾讯QQ,就会发现它的登录有如下特点:它可以手机电脑同时在线,但是不能在两个手机上同时登录一个账号。同端互斥登录,指的就是:像腾讯QQ一样,在同一类型设备上只允许单地点登录,...

微信小程序扫码登录的实现(微信小程序实现扫码功能)

上海天正信息科技有限公司Topcheer-AM数智运管平台-提供IT运维产品与服务二维码扫描登录是一种便捷的登录方式,用户通过使用移动设备扫描电脑端显示的二维码,即可快速登录系统,无需手动输入用户名和...