springBoot中不添加依赖 , 手动生成一个token ,并校验token,在统一拦截器中进行校验 (使用简单 , 但是安全性会低一点)

要在 Spring Boot 里实现接口统一拦截并校验 Token,可以借助 Spring 的拦截器机制。下面是具体的实现步骤和代码示例。

1. 创建 Token 工具类

java 复制代码
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Date;

public class TokenUtils {
    // 密钥,可根据实际情况修改
    private static final String SECRET_KEY = "yourSecretKey";
    // Token 过期时间,单位为毫秒,这里设置为 1 小时
    private static final long EXPIRATION_TIME = 1000 * 60 * 60;

    // 生成 Token 的方法
    public static String generateToken(String username) {
        long timestamp = new Date().getTime();
        String data = username + ":" + timestamp;
        String hash = hashData(data + SECRET_KEY);
        return data + ":" + hash;
    }

    // 校验 Token 的方法
    public static boolean validateToken(String token, String username) {
        String[] parts = token.split(":");
        if (parts.length != 3) {
            return false;
        }
        String storedUsername = parts[0];
        long timestamp = Long.parseLong(parts[1]);
        String storedHash = parts[2];

        // 检查用户名是否匹配
        if (!storedUsername.equals(username)) {
            return false;
        }

        // 检查 Token 是否过期
        if (new Date().getTime() - timestamp > EXPIRATION_TIME) {
            return false;
        }

        // 重新计算哈希值并比较
        String data = storedUsername + ":" + timestamp;
        String newHash = hashData(data + SECRET_KEY);
        return newHash.equals(storedHash);
    }

    // 哈希处理方法
    private static String hashData(String data) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] encodedHash = digest.digest(data.getBytes(StandardCharsets.UTF_8));
            return Base64.getEncoder().encodeToString(encodedHash);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
}

2. 创建 Token 拦截器

java 复制代码
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Component
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从请求头中获取 Token
        String token = request.getHeader("Authorization");
        // 这里简单假设用户名在请求参数中,实际应用中可根据需求调整
        String username = request.getParameter("username");

        if (token == null || username == null) {
            sendErrorResponse(response, "Token or username is missing");
            return false;
        }

        if (!TokenUtils.validateToken(token, username)) {
            sendErrorResponse(response, "Invalid Token");
            return false;
        }

        return true;
    }

    private void sendErrorResponse(HttpServletResponse response, String message) throws IOException {
        response.setContentType("application/json;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.write("{\"error\": \"" + message + "\"}");
        writer.flush();
        writer.close();
    }
}

3. 配置拦截器

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
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 {

    @Autowired
    private TokenInterceptor tokenInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/login"); // 排除登录接口
    }
}

4. 控制器示例

java 复制代码
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

@RestController
public class AuthController {

    @PostMapping("/login")
    public Map<String, String> login(@RequestBody Map<String, String> credentials) {
        String username = credentials.get("username");
        String password = credentials.get("password");

        // 这里可以添加用户名和密码的验证逻辑
        if ("yourUsername".equals(username) && "yourPassword".equals(password)) {
            String token = TokenUtils.generateToken(username);
            Map<String, String> response = new HashMap<>();
            response.put("token", token);
            return response;
        } else {
            return new HashMap<>();
        }
    }

    @PostMapping("/test")
    public String test() {
        return "Token validation passed";
    }
}

代码解释

  • TokenUtils 类:负责生成和校验 Token。
  • TokenInterceptor 类 :实现了 HandlerInterceptor 接口,在 preHandle 方法中对请求进行拦截,从请求头中获取 Token,从请求参数中获取用户名,调用 TokenUtils 类的 validateToken 方法进行校验。若校验不通过,返回错误响应。
  • WebConfig 类 :实现了 WebMvcConfigurer 接口,在 addInterceptors 方法中配置拦截器,拦截所有请求,但排除登录接口。
  • AuthController 类 :包含登录接口 /login 和测试接口 /test,登录接口用于生成 Token,测试接口用于验证 Token 校验是否生效。

通过以上步骤,就能在 Spring Boot 中实现接口统一拦截并校验 Token。

相关推荐
古城小栈1 分钟前
Spring AI 1.1:快速接入主流 LLM,实现智能问答与文本生成
java·人工智能·spring boot·spring
计算机学姐2 分钟前
基于SSM的宠物领养管理系统【2026最新】
java·vue.js·后端·java-ee·tomcat·mybatis·宠物
后端小张4 分钟前
【JAVA进阶】鸿蒙开发与SpringBoot深度融合:从接口设计到服务部署全解析
java·spring boot·spring·spring cloud·华为·harmonyos·鸿蒙
Qiuner4 分钟前
Spring Boot AOP(一) 入门与核心概念
java·spring boot·后端·spring·aop
carry杰5 分钟前
Springboot3 + shardingsphere-jdbc5.5.2 按年月分表(动态创建表)
java·spring cloud
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ5 分钟前
throw new Exception 如何指定返回code
java·开发语言
C雨后彩虹6 分钟前
虚拟理财游戏
java·数据结构·算法·华为·面试
fegggye13 分钟前
创建一个rust写的python库
开发语言·后端·rust
武子康14 分钟前
Java-197 消息队列应用场景:缓存预热+限流排队+Redis Lua 扣库存+MQ 削峰填谷
java·redis·缓存·性能优化·消息队列·rabbitmq·java-rabbitmq
全靠bug跑15 分钟前
Spring Cloud Gateway 实战:统一鉴权与用户信息全链路透传
java·开发语言·gateway·拦截器