后端登录安全的一种思路
PS:作者是小白能接触到的就只会这样写。勿喷。
前提
思路: 结合io流将登录token存储到配置文件中,不将token存储到浏览器端,从而避免盗取。
下面jwt的学习可以参考下这个:
JWT --- 入门学习_本郡主是喵的博客-CSDN博客
JWT工具类
@Component
public class JWTtUtils {public static final String USER_NAME = "username";public static final String PASS_WORD = "password";public static final String CREATE_TIME = "createTime";public static final String SIGN_KEY = "QHX2004"; // 解析key/*** 用用户名和密码生成JWT** @param username* @param password* @return*/public String generatorJWTFromUserNameAndPassword(String username,String password){HashMap<String, Object> hashMap = new HashMap<>(); // 生成maphashMap.put(USER_NAME,username);hashMap.put(PASS_WORD,password);hashMap.put(CREATE_TIME,new Date());return generatorJWTFromUserNameAndPassword(hashMap);}/*** 生成jwt过期时间,1个月** @param* @return*/private Date generatorExpirationDate() {return new Date(System.currentTimeMillis() + (1000L * 60 * 60 *24 *30));}/*** 用用户名和密码生成jwt** @param paramMap* @return*/private String generatorJWTFromUserNameAndPassword(HashMap<String, Object> paramMap) {JwtBuilder jwtBuilder = Jwts.builder().setClaims(paramMap).setExpiration(generatorExpirationDate()) // 设置过期时间.signWith(SignatureAlgorithm.HS512,SIGN_KEY);return jwtBuilder.compact(); // 拿到token}/*** 解析token拿到Claims*** @param token* @return*/private Claims getClaimsFromToken(String token){Claims claims = Jwts.parser().setSigningKey(SIGN_KEY).parseClaimsJws(token).getBody();return claims;}/*** 校验token是否过期** @param token* @return*/// 过期返回truepublic boolean checkTokenIsOverdue(String token){Claims claims = getClaimsFromToken(token);Date date = claims.getExpiration();return date.getTime() < new Date().getTime();}/*** 刷新token:重新生成一个token** @param* @return*/public String flushToken(String token){Claims claims = getClaimsFromToken(token);String username = (String) claims.get(USER_NAME);String password = (String)claims.get(PASS_WORD);return generatorJWTFromUserNameAndPassword(username,password);}}
IO工具类
public class IOUtils {public static final String FILE_NAME = "conf.properties";/*** 配置文件读取* @param key* @return value*/public static String getPropertiesKey(String key) {return getKey(key);}/*** 配置文件读取** @param key* @return*/private static String getKey(String key) {Properties properties = new Properties();File file = new File(FILE_NAME);FileInputStream inputStream = null;try {inputStream = new FileInputStream(file);properties.load(inputStream); // 其实已经将配置文件拿到手了} catch (IOException e) {e.printStackTrace();}finally {if(inputStream != null){ // 还是这样关比较好,万一报错就tm关不了try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return properties.getProperty(key);}/*** 配置文件设置** @param key* @param value* @return*/public static boolean setPropertiesKey(String key,String value) {// 判断key是否有重复String key1 = getKey(key);if(key1 == null){return setKey(key,value); // 把核心业务逻辑抽出来}return false;}/*** 配置文件设置** @param key* @param value* @return boolean*/private static boolean setKey(String key, String value) {Properties properties = new Properties();File file = new File(FILE_NAME); // 其实有其他配置可以同意下yaml文件里面配置,然后这里面读取,好统一调配。FileWriter fileWriter = null;try {fileWriter = new FileWriter(file,true);properties.setProperty(key, value); // 存进map里面properties.store(fileWriter,""); // 将map对应的键值对写进输出流。} catch (IOException e) {// 卧槽我加入设置key,value失败,肯定调到这个逻辑return false;} finally {if (fileWriter != null) { // 还是这样关比较好,万一报错就tm关不了try {fileWriter.flush();fileWriter.close();} catch (IOException e) {e.printStackTrace();}}}return true;}}
测试文件
@SpringBootTest
class IoDemoApplicationTests {@Testvoid contextLoads() {// 用户第一登录 ----,我们这里浏览器端不存token,只存用户名,更安全。String username = "qhx2005";String password = "123456";// 生成jwtJWTtUtils jwTtUtils = new JWTtUtils();String token = jwTtUtils.generatorJWTFromUserNameAndPassword(username, password);// 将jwt存进配置文件boolean success = IOUtils.setPropertiesKey(username, token);System.out.println("存进配置文件成功状态:"+success);assert success;// 用户登录后访问其他页面。检验token过期,拿出配置文件是否存在----// 获取tokenString token1 = IOUtils.getPropertiesKey(username);System.out.println(token1);// 检验token是否过期boolean overdue = jwTtUtils.checkTokenIsOverdue(token);// 本来这里如果token过期,我们响应一个状态码,让前端axios过滤器捕获到,删除本地username,重定向到登录页。System.out.println("已经过期:"+overdue);}}
相关文章:
后端登录安全的一种思路
PS:作者是小白能接触到的就只会这样写。勿喷。 前提 思路: 结合io流将登录token存储到配置文件中,不将token存储到浏览器端,从而避免盗取。 下面jwt的学习可以参考下这个: JWT --- 入门学习_本郡主是喵的博客-CSDN博客 JWT工具类 Component public class JWTtU…...
【深度学习_TensorFlow】激活函数
写在前面 上篇文章我们了解到感知机使用的阶跃函数和符号函数,它们都是非连续,导数为0的函数: 建议回顾上篇文章,本篇文章将介绍神经网络中的常见激活函数,这些函数都是平滑可导的,适合于梯度下降算法。 写…...
机器学习笔记之优化算法(七)线搜索方法(步长角度;非精确搜索;Wolfe Condition)
机器学习笔记之优化算法——线搜索方法[步长角度,非精确搜索,Wolfe Condition] 引言回顾: Armijo \text{Armijo} Armijo准则及其弊端 Glodstein \text{Glodstein} Glodstein准则及其弊端 Wolfe Condition \text{Wolfe Condition} Wolfe Condi…...
十四.redis哨兵模式
redis哨兵模式 1.概述2.测试3.哨兵模式优缺点 redis哨兵模式基础是主从复制 1.概述 主从切换的技术方法:当主节点服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服…...
采用UWB技术开发的智慧工厂人员定位系统源码【UWB定位基站、卡牌】
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。UWB定位系统依托在移动通信,雷达,微波电路,云计算与大数据…...
当你软件测试遇上加密接口,是不是就不能测了?
相信大家在工作中做接口测试的时候,肯定会遇到一个场景,那就是你们的软件,密码是加密存储的。 那么这样的话,我们在执行接口的时候,对于密码的处理就开始头疼了。 所以,本文将使用jmeter这款java开源的接…...
Flink
Flink(Apache Flink)是一个开源的分布式流处理引擎和批处理框架。它是由 Apache 软件基金会维护的项目,旨在处理大规模数据的实时流式处理和批处理任务。Flink 提供了强大的流处理和批处理功能,具有低延迟、高吞吐量和高容错性&am…...
python入门常用操作
python常用操作 1、ndarry数组的切片2、print用法2.1格式化输出format2.2字符串格式化输出 3、均值滤波函数 1、ndarry数组的切片 例如一个5列的ndarry数组,想要获取第2列和第3列数据,可以用 #(1)用法1 data[:,1:3],…...
SpringBoot复习:(21)自定义ImportBeanDefinitionRegistrar
要达到的目的:将某个包下使用了某个自定义注解(比如MyClassMapper)的类注册到Spring 容器。 一、自定义注解: package com.example.demo.service;import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy;Rete…...
小黑子—JavaWeb:第五章 - JSP与会话跟踪技术
JavaWeb入门5.0 1. JSP1.1 JSP快速入门1.2 JSP原理1.3 JSP脚本1.3.1 JSP缺点 1.4 EL 表达式1.5 JSTL 标签1.5.1 JSTL 快速入门1.5.1 - I JSTL标签if1.5.1 - II JSTL标签forEach 1.6 MVC模式1.7 三层架构1.8 实现案例1.8.1 环境准备1.8.2 查询所有1.8.3 添加数据1.8.4 修改1.8.4…...
Python - 【socket】 客户端client重连处理简单示例Demo(一)
一. 前言 在Python中,使用socket进行网络通信时,如果连接断开,可以通过以下步骤实现重连处理 二. 示例代码 1. 定义一个函数,用于建立socket连接 import socketdef connect_socket(host, port):while True:try:# 建立socket连…...
Redis 基础
1.定义 Redis 是一个高性能的key-value数据库,key是字符串类型。 2.核心特点: 单进程: Redis的服务器程序采用的是单进程模型来处理客户端的请求。对读写时间的响 应是通过对epoll函数的包装来做到的。 3.数据类型: 键的类型…...
【0805作业】Linux中 AB终端通过两根有名管道进行通信聊天(半双工)
作业一:打开两个终端,要求实现AB进程对话【两根管道】 打开两个终端,要求实现AB进程对话 A进程先发送一句话给B进程,B进程接收后打印B进程再回复一句话给A进程,A进程接收后打印重复1.2步骤,当收到quit后&am…...
ruby - ckeditor 设置编辑器高度
参考:Blogs <% f.cktext_area :zh_content, ckeditor: { height: 1000} %>...
WMS仓库管理系统研发规划说明
01 产品背景 1.1 背景概述 aboss WMS东南亚仓库管理系统是一个基于BigSeller系统的使用基础上,加上多仓库的解决思路,解决入库业务、出库业务、仓库调拨、库存调拨和虚仓管理等功能,对批次管理、物料对应、库存盘点、质检管理、虚仓管理和即…...
JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战
学习来源:尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 📚事件对象📚事件的冒泡📚事件的委派📚事件的绑定🐇赋值绑定🐇addEventListener()🐇attachEvent()&…...
实验心得,包括代码复现工作的体会
实践是检验真理的唯一标准 resnet20,cifar100. Direct training: 和原论文一样的参数 64.45 time step 1, Accuracy 0.5918 time step 2, Accuracy 0.6320 time step 4, Accuracy 0.6446 time step 8, Accuracy 0.6531 time step 16, Accuracy 0.6608 time ste…...
RabbitMQ(二)
二、高级特性、应用问题以及集群搭建 高级特性 1.消息的可靠性投递 在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。 rabbitMQ整个消息投递的路径为: produ…...
Linux软件实操
systemctl命令 Linux系统的很多内置或第三方的软件均支持使用systemctl命令控制软件(服务)的启动、停止、开机自启 systemctl start(启动) 或 stop(关闭) 或 status(查看状态) 或 enable(开启开机自启) disable(关闭开机自启) 服务名: 控制服务的状态 系统内置的服务: Netwo…...
kagNet:对常识推理的知识感知图网络 8.4+8.5
这里写目录标题 摘要介绍概述问题陈述推理流程 模式图基础概念识别模式图构造概念网通过寻找路径来匹配子图基于KG嵌入的路径修剪 知识感知图网络图卷积网络(GCN)关系路径编码分层注意机制 实验数据集和使用步骤比较方法KAGNET是实施细节性能比较和分析I…...
如何使用 Graphviz 在 5 分钟内创建专业流程图:Python 数据可视化终极指南
如何使用 Graphviz 在 5 分钟内创建专业流程图:Python 数据可视化终极指南 【免费下载链接】graphviz Simple Python interface for Graphviz 项目地址: https://gitcode.com/gh_mirrors/gr/graphviz 想要快速创建专业流程图吗?Graphviz 是一个强…...
Legacy iOS Kit:让旧iPhone重获新生的终极降级工具
Legacy iOS Kit:让旧iPhone重获新生的终极降级工具 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你是…...
QMCDecode终极指南:3步搞定QQ音乐加密文件,让音乐真正属于你
QMCDecode终极指南:3步搞定QQ音乐加密文件,让音乐真正属于你 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录…...
【职场】职场“贵人“的真相:他们从不随机出现,也从不无缘无故消失
职场"贵人"的真相:他们从不随机出现,也从不无缘无故消失每个在职场里走得还不错的人,回头看,都能说出一两个名字。 那个在你最迷茫的时候,把你带进了某个重要的圈子;那个在关键会议上,…...
重磅喜报!中国星坤入围东莞上规资助计划,政企携手共筑智造标杆
近日,东莞市工业和信息化局正式公布 2026 年支持工业企业上规发展做大做强项目拟资助计划,中国星坤(XKB Connection)凭借在电子连接器领域的技术实力与稳健发展,成功入选,成为东莞智造升级的标杆企业之一东…...
仓库盘点、物流交接?用UniApp+PDA扫码提升效率的实战配置与避坑指南
UniAppPDA扫码在仓储物流中的实战配置与效率提升指南 当仓储管理员小李第一次使用传统扫码枪配合PC系统进行月度盘点时,他需要反复核对Excel表格与实物位置,8小时的工作量常常延长到深夜。而现在,通过UniApp开发的移动端应用配合工业级PDA设备…...
蘑菇博客MoguBlog:微服务架构的前后端分离博客系统完整指南 [特殊字符]
蘑菇博客MoguBlog:微服务架构的前后端分离博客系统完整指南 🚀 【免费下载链接】mogu_blog_v2 蘑菇博客(MoguBlog),一个基于微服务架构的前后端分离博客系统。Web端使用Vue Element , 移动端使用uniapp和ColorUI。后端使用Spring cloud Spr…...
瑞芯微RK3588核心板规格书,详细参数配置,定位ARM高端AIOT智能模组,板对板连接器320Pin 间距0.5 B to B连接器
触觉智能研发的瑞芯微RK3588核心板,板对板连接器320Pin 间距0.5 B to B连接器,型号简写SOM3588-V1,在CSDN平台留下规格书方便大家查看。1. 产品概述1.1 IDO-SOM3588-V1适用范围IDO-SOM3588-V1核心板适用于工业主机,边缘计算网关、…...
3分钟搞定音乐格式转换:你的私人音乐解锁神器使用全攻略
3分钟搞定音乐格式转换:你的私人音乐解锁神器使用全攻略 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: htt…...
别再只会点灯了!用Arduino和WS2812B灯带做个会呼吸的桌面氛围灯(附完整代码)
用Arduino打造会呼吸的WS2812B智能氛围灯系统 你是否已经厌倦了简单的LED闪烁效果?想让你的工作台或游戏空间拥有更高级的光效体验?今天我们将突破基础点灯的局限,用Arduino和WS2812B灯带打造一套具备呼吸效果的智能氛围灯系统。这不仅仅是一…...
