news 2026/10/21 2:31:48

SpringBoot4 + Vue3 实现全局跨域配置与 JWT 登录鉴权|计算机毕设实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot4 + Vue3 实现全局跨域配置与 JWT 登录鉴权|计算机毕设实战

技术栈版本:
SpringBoot 4.0.x
JDK 21
JJWT 0.12.x
Vue3 + Vite + Element Plus
MySQL8.0
毕设后台系统必备登录认证模块,SpringBoot4 环境很多依赖包版本需要适配升级。

一、pom.xml 核心依赖

<!-- SpringBoot4 Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JJWT JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.5</version> <scope>runtime</scope> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>

二、application.yml 配置

spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/bs_admin?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # jwt配置 jwt: secretKey: abcdefghijklmnopqabcdefghijklmnopq expireTime: 86400000 # 24小时,单位毫秒

三、JWT 工具类

package com.bs.util; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.Date; @Component public class JwtUtil { @Value("${jwt.secretKey}") private String secretKeyStr; @Value("${jwt.expireTime}") private long expireTime; // 获取密钥 private SecretKey getSecretKey(){ return Keys.hmacShaKeyFor(secretKeyStr.getBytes(StandardCharsets.UTF_8)); } // 生成token public String generateToken(Long userId){ Date now = new Date(); Date expireDate = new Date(now.getTime() + expireTime); return Jwts.builder() .subject(userId.toString()) .issuedAt(now) .expiration(expireDate) .signWith(getSecretKey()) .compact(); } // 解析token获取用户id public Long getUserIdByToken(String token){ Claims claims = Jwts.parser() .verifyWith(getSecretKey()) .build() .parseSignedClaims(token) .getPayload(); return Long.valueOf(claims.getSubject()); } // 校验token是否有效 public boolean validateToken(String token){ try { Jwts.parser().verifyWith(getSecretKey()).build().parseSignedClaims(token); return true; }catch (Exception e){ return false; } } }

四、全局跨域配置类

package com.bs.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowCredentials(true) .allowedMethods("GET","POST","PUT","DELETE") .maxAge(3600); } }

五、JWT 拦截器

package com.bs.interceptor; import com.bs.util.JwtUtil; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; @Component public class JwtInterceptor implements HandlerInterceptor { @Resource private JwtUtil jwtUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 登录接口放行 String uri = request.getRequestURI(); if("/api/login".equals(uri)){ return true; } String token = request.getHeader("token"); if(token == null || !jwtUtil.validateToken(token)){ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } return true; } }

六、注册拦截器

package com.bs.config; import com.bs.interceptor.JwtInterceptor; import jakarta.annotation.Resource; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Resource private JwtInterceptor jwtInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(jwtInterceptor) .addPathPatterns("/**"); } }

七、Controller 登录接口

package com.bs.controller; import com.bs.util.JwtUtil; import jakarta.annotation.Resource; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class LoginController { @Resource private JwtUtil jwtUtil; @PostMapping("/login") public Object login(String username,String password){ // 这里替换为数据库查询账号密码逻辑 if("admin".equals(username) && "123456".equals(password)){ String token = jwtUtil.generateToken(1L); return java.util.Map.of("code",200,"msg","登录成功","token",token); } return java.util.Map.of("code",400,"msg","账号密码错误"); } }

八、Vue3 前端请求携带 Token 示例

// axios请求拦截器 import axios from 'axios' const service = axios.create({ baseURL:'http://localhost:8080' }) service.interceptors.request.use(config=>{ const token = localStorage.getItem('token') if(token){ config.headers.token = token } return config }) export default service

九、SpringBoot4 毕设踩坑要点

  1. SpringBoot4 最低要求 JDK21,不能继续使用 JDK17,启动直接报错
  2. 包全部是jakarta.*,不存在 javax 包
  3. JJWT 新版本 API 和旧版完全不一样,不能沿用老版本生成 token 代码
  4. 跨域和拦截器在 SpringBoot4 WebMvc 配置方式不变,但要注意包导入
  5. 生产环境密钥不要硬编码,放到配置中心或者环境变量
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 2:31:25

开源项目停更≠死掉:判断维护状态与应对冻结代码的实用策略

如果你最近在Gitee上找开源组件&#xff0c;大概率会遇到一种情况&#xff1a;翻看一个仓库的提交记录&#xff0c;最后一次commit写的是2023年6月&#xff0c;然后又翻了几个仓库&#xff0c;情况惊人地相似。这不是某个项目的特例&#xff0c;而是一整片区域内的项目都停在了…

作者头像 李华
网站建设 2026/10/21 2:31:06

Claude Code Skills 放对目录却不生效:插件启用顺序与缓存的三个坑

本文摘要&#xff1a;Skill 放对目录仍不生效是静默失败&#xff0c;常被误判为模型问题。本文复现目录冲突、frontmatter 缺失与 instincts 抢占三种失败&#xff0c;用日志确认加载。 一、问题与结论 从 mattpocock/skills 复制一个 Skill 到项目根目录的 .agents/skills/&a…

作者头像 李华
网站建设 2026/10/21 2:30:36

【LLM技术全景】第41篇 边缘设备部署:手机与IoT设备上的LLM

系列:《LLM技术全景:从Token到部署》工程实践篇第9篇 承接:第40篇《本地部署实战(二):GPU部署与多卡推理》| 预告:第42篇《多模态模型部署:视觉语言模型的服务化》 摘要 核心问题:第 39、40 篇我们把模型装进了 PC/服务器的 GPU——但现实里更多推理发生在"口袋…

作者头像 李华
网站建设 2026/10/21 2:30:23

【虎鲸进化论 34】它还在进化:进行时与可迁移 checklist

【虎鲸进化论 34】它还在进化&#xff1a;进行时与可迁移 checklist 本文是「虎鲸进化论」系列第 35 篇&#xff08;正文第 34 篇&#xff09;&#xff0c;也是卷Ⅲ「自进化实录」的最后一篇。上一篇&#xff1a;Token 经济学&#xff1b;下一篇预告&#xff1a;产能几百倍&…

作者头像 李华
网站建设 2026/10/21 2:30:09

给Agent接代码沙箱:六个容易踩的坑

给Agent接代码沙箱&#xff1a;六个容易踩的坑原文&#xff1a;GitHub - 《SPACE&#xff1a;给智能体跑代码的沙箱平台&#xff08;仓库与架构文档&#xff09;》&#xff08;https://github.com/perplexityai/space&#xff09;前言 让 Agent 写代码不难&#xff0c;难的是让…

作者头像 李华
网站建设 2026/10/21 2:30:09

率能半导体 SS6323H三相无刷直流电机驱动芯片:18V/2.3A,覆盖三相BLDC电机、风扇、泵、机器人等应用场景

在三相无刷直流电机&#xff08;BLDC&#xff09;驱动设计中&#xff0c;工程师通常需要构建三个半桥来驱动电机的三相绕组。传统方案需要三颗半桥栅极驱动器加六颗外置功率MOSFET&#xff0c;不仅占用大量PCB面积&#xff0c;还增加了设计复杂度和BOM成本。如果有一颗芯片能够…

作者头像 李华