实现一个带有授权码和使用时间限制的Spring Boot项目

  1. 生成和验证授权码
  2. 记录授权时间和过期时间
  3. 实现授权逻辑

以下是具体的实现方法:

1. 生成和验证授权码

可以使用加密技术生成和验证授权码。授权码中可以包含有效期等信息,并使用密钥进行签名。

示例代码:

java复制代码
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.concurrent.TimeUnit;public class LicenseManager {private static final String SECRET_KEY = "your_secret_key";public static String generateLicense(String userId, long durationInDays) throws Exception {long currentTime = System.currentTimeMillis();long expiryTime = currentTime + TimeUnit.DAYS.toMillis(durationInDays);String data = userId + ":" + expiryTime;Mac sha256HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "HmacSHA256");sha256HMAC.init(secretKey);String hash = Base64.getEncoder().encodeToString(sha256HMAC.doFinal(data.getBytes()));return Base64.getEncoder().encodeToString((data + ":" + hash).getBytes());}public static boolean validateLicense(String license) throws Exception {String decodedLicense = new String(Base64.getDecoder().decode(license));String[] parts = decodedLicense.split(":");if (parts.length != 3) return false;String data = parts[0] + ":" + parts[1];String hash = parts[2];Mac sha256HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "HmacSHA256");sha256HMAC.init(secretKey);String calculatedHash = Base64.getEncoder().encodeToString(sha256HMAC.doFinal(data.getBytes()));if (!calculatedHash.equals(hash)) return false;long expiryTime = Long.parseLong(parts[1]);return System.currentTimeMillis() <= expiryTime;}
}

2. 记录授权时间和过期时间

通过授权码生成和验证,可以记录和检查授权时间和过期时间。

3. 实现授权逻辑

在Spring Boot应用中,通过拦截器或过滤器来验证每次请求的授权码。

示例代码:

创建一个拦截器

java复制代码
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class LicenseInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String license = request.getHeader("License-Key");if (license == null || !LicenseManager.validateLicense(license)) {response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "License is invalid or expired");return false;}return true;}
}

注册拦截器

在Spring Boot配置类中注册拦截器:

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 {@Autowiredprivate LicenseInterceptor licenseInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(licenseInterceptor).addPathPatterns("/**");}
}

4. 使用授权码

公司使用项目时,需要将授权码放在HTTP请求头中:

http复制代码
GET /your/api/endpoint
License-Key: generated_license_key

5. 重新授权

在3个月到期后,需要重新生成并分发新的授权码。可以为此创建一个管理端点来帮助重新授权。

示例代码:

java复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class LicenseController {@GetMapping("/generateLicense")public String generateLicense(@RequestParam String userId, @RequestParam long durationInDays) throws Exception {return LicenseManager.generateLicense(userId, durationInDays);}
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/82309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

官方SDK停更后的选择:开源维护的Bugly Unity SDK

腾讯Bugly&#xff0c;为移动开发者提供专业的异常上报和运营统计&#xff0c;帮助开发者快速发现并解决异常&#xff0c;同时掌握产品运营动态&#xff0c;及时跟进用户反馈。 但是&#xff0c;免费版的Unity SDK已经很久不更新了&#xff0c;会有一些问题和特性缺失&#xff…

Spring Boot分页查询进阶:整合Spring Data REST实现高效数据导航

目录&#xff1a; 引言分页查询基础回顾 2.1 Spring Data JPA分页接口 2.2 Pageable与Page的使用 2.3 常见分页参数设计Spring Data REST简介 3.1 HATEOAS与超媒体驱动API 3.2 Spring Data REST核心功能 3.3 自动暴露Repository接口整合Spring Boot与Spring Data REST 4.1 项目…

[Datagear] [SQL]实现分组统计同时带汇总行的两种方式对比分析

在进行数据可视化开发时,我们经常会遇到用户提出的需求:除了展示按某字段分组统计的数据外,还希望看到一个“整体总计”的数据行。这种汇总行在报表、图表展示中极为常见,可以帮助用户快速理解全局数据水平。 实现这一功能的方法主要有两种:一种是使用 SQL 的 GROUP BY ..…

Docker常用命令介绍

Docker常用命令 1、本地镜像管理 save 命令 将一个或多个 Docker 镜像保存到一个 tar 归档文件中&#xff0c;以便在其他环境中分发或备份。 # 语法&#xff1a;docker save [OPTIONS] IMAGE [IMAGE...]# 保存单个镜像到文件 docker save -o myimage.tar myimage:latest# 保…

09 接口自动化-用例管理框架pytest之allure报告定制以及数据驱动

文章目录 一、企业级的Allure报告的定制左边的定制&#xff1a;右边的定制&#xff1a;1.用例的严重程度/优先级2.用例描述3.测试用例连接的定制4.测试用例步骤的定制5.附件的定制 二、企业中真实的定制有哪些&#xff1f;三、allure报告如何在本地访问四、allure中的数据驱动装…

DDoS防护实战——从基础配置到高防IP部署

一、基础防护&#xff1a;服务器与网络层加固 Linux内核优化&#xff1a; 调整TCP协议栈参数&#xff0c;缓解SYN Flood攻击&#xff1a; # 启用SYN Cookie并减少超时时间 echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout…

华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent

前引&#xff1a;重磅来袭&#xff01;本次以DeepSeek-V3/R1商用大模型和Dify-LLM应用平台一键部署为核心&#xff0c;专为新手打造“开箱即用”的AI开发体验。无论你是想快速搭建企业级AI应用&#xff0c;还是探索大模型落地的无限可能&#xff0c;只需跟随小编实现三步走&…

SQLAlchemy 2.0 查询使用指南

SQLAlchemy 2.0 查询使用指南 1. 环境设置 首先&#xff0c;需要安装 SQLAlchemy 2.0 版本。假设你使用的是 SQLite 数据库&#xff0c;可以通过以下命令安装 SQLAlchemy&#xff1a; pip install sqlalchemy接着&#xff0c;我们创建数据库连接并初始化会话&#xff1a; f…

Windows 使用 WSL 安装 Ubuntu

一&#xff0c;前言 Windows 上轻松跑 Linux 又不想用笨重的VMware 和VirtualBox &#xff0c;怎么办&#xff1f; 开源项目 Windows Subsystem for Linux (WSL)。它解决了许多开发者在 Windows 和 Linux 间切换的痛点&#xff0c;实现在 Windows 上无缝跑 Linux 工具和命令。…

[Excel VBA]如何製作買三送一優惠條件的POS結帳介面?

Excel I VBA I 買三送一優惠條件的POS結帳機 因應商品特賣活動&#xff0c;結帳介面需整合特定優惠條件&#xff0c;如買三送一&#xff0c;買五送二等等優惠條件。本文封面影片以買三送一為範例&#xff0c;並搭配VBA和對應按鈕&#xff0c;而實現銷售訂單紀錄和即時更新庫存等…

3d世界坐标系转屏幕坐标系

世界坐标 ——> NDC标准设备坐标 ——> 屏幕坐标 标准设备NDC坐标系 屏幕坐标系 .project方法将 将向量(坐标)从世界空间投影到相机的标准化设备坐标 (NDC) 空间。 手动实现HTML元素定位到模型位置&#xff0c;实现模型标签效果&#xff08;和css2Render原理同理&#…

Idea出现 100% classes 等

总是误点出来&#xff0c;每次又忘了怎么消除&#xff0c;在这里记录一下。 出现这样&#xff1a; 操作idea界面的&#xff1a;点击View->Tool Windows ->Coverage&#xff0c;然后关掉

从零开始学习QT——第一步

一、Qt 1.1、Qt是什么 Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正的组件编程。 1.2、Qt的发展历程 1991年 Qt最早由芬兰奇趣科技开发 1996年 进入商业…

MySQL 8.0 OCP 1Z0-908 171-180题

Q171.Examine this MySQL client command to connect to a remote database: mysql-h remote-example.org-u root–protocolTCP–ssl-mode Which two–ss1-mode values will ensure that an X.509-compliant certificate will be used to establish the SSL/TLS connection to …

【机器学习】 关于外插修正随机梯度方法的数值实验

1. 随机梯度下降&#xff08;SGD&#xff09; 迭代格式&#xff1a; x k 1 x k − η k ∇ f i ( x k ) x_{k1} x_k - \eta_k \nabla f_i(x_k) xk1​xk​−ηk​∇fi​(xk​) 其中&#xff0c; η k \eta_k ηk​ 为步长&#xff08;可能递减&#xff09;&#xff0c; ∇ f…

每日c/c++题 备战蓝桥杯(洛谷P3382 三分法求极值详解)

洛谷P3382 三分法求极值详解 题目描述 P3382 三分法 要求在给定区间内寻找一个多项式函数的最大值点。题目保证函数在区间内先严格递增后严格递减&#xff08;单峰函数&#xff09;&#xff0c;适合使用三分法求解。 算法原理 三分法核心思想 对于单峰函数&#xff0c;在区…

[Windows] 一键实现重复工作自动化zTasker

zTasker&#xff0c;是一款定时&#xff5c;热键&#xff5c;纯粹的自动化任务神器。它支持超过100种任务类型&#xff0c;包括提醒、关机重启、报时、挡屏休息、文件备份、音量调节、静音等。用户可以通过定时、CPU占用、文件夹监控、网速、快捷键等多种条件触发任务。 简单点…

Docker核心笔记

一、概述 1、架构 Docker容器基于镜像运行,容器共享宿主机的内核,不会加载额外内核,通过Namespaces(环境隔离)和Cgroups(资源控制)实现隔离,Cgroups会限容器使用资源并控制优先级和统计数据。隔离后的容器仅包含应用所需的用户态依赖 2、安装 安装先卸载再安装,使用的yum…

2025年电工杯数学建模B题【垃圾运输】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025年电工杯数学建模B题【垃圾运输】完整的成品论文。 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 一、问题重述 二&#xff0e;问题分析 2.1问题一 2.2问题二 2.3问题三 三、模型假设 …

[爬虫知识] IP代理

相关实战案例&#xff1a;[爬虫实战] 代理爬取&#xff1a;小白也能看懂怎么用代理 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 引言&#xff1a;爬虫与IP封锁的攻防战 对网络爬虫而言&#xff0c;遇到的一个较棘手的问题就是封IP&#xff1a;请…