博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池
博客系统(二)
- 博客系统
- 获取当前用户的信息
- 对密码进行加密和解密的操作
- 设置统一的数据返回格式
- 设置未登录拦截
- 设置线程池
博客系统
博客系统是干什么的?
CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统,这是一个较为简单的博客系统,但是主要功能一个不缺,不过就是 UI 有些 low,我学习前端是为了写后端更加顺手。不至于前后端完全分离,但是有个问题设计的 web 页面不是很好看。
首先我将整体的业务流程展现

我们继博客系统(一)继续,编写
获取当前用户的信息
根据项目结构图可以知道,我们无论是登录还是查询必须要获取当前的用户的信息。
根据session的特点,他会自己生成一个cooker值,我们这里只需要获取信息,但是session是一个 key:value 结构的值,所以还需要的一个公共的,全局变量 ,key值。用来保存和查找对应的value值
/*** 全局变量*/
public class Variable {public static final String SESSION_USERINFO_KEY="SESSION_USERINFO";
}

接下来我们就可以根据key去寻找当前的用户信息了。
/*** 得到当前的用户信息*/public class SessionUtis {public static Userinfo getUser(HttpServletRequest request){HttpSession httpSession=request.getSession(false);if (httpSession!=null&&httpSession.getAttribute(Variable.SESSION_USERINFO_KEY)!=httpSession){return (Userinfo) httpSession.getAttribute(Variable.SESSION_USERINFO_KEY);}return null;}
}

对密码进行加密和解密的操作
首先 UUID 这个类是可以生产出世界上唯一的值(目前是),市面上的加密工具,有很多,我们用 MD5(C级)的就够了,毕竟是个小网站。
我规定:
- 最终密码生成为65位字符
- UUID生成的唯一值与用户所注册的密码合并通过加密工具进行加密。得到一个唯一的值
- 将这个唯一的值与UUID数生成的唯一的值合并。二者通过 @ 分隔
- 因为在MD5只能正向加密不能反向解密,所以我们要将唯一的UUID进行保存,从而在解密以及验证密码正确性上有操作空间
- java基本库里为我们提供了UUID生成类,要搭配方法 randomUUID 使用,且生成的uuid有一些特殊字符,需要我们手动去除,此时得到的是一个32位的唯一字符串
- java基本库里为我们提供了MD5的加密工具类,DigestUtils,搭配md5DigestAsHex()使用,但是参数是一个二进制数组所以,需要getBytes转换。
/*** 对密码进行加密,解密*/
public class PasswordUtils {/*** 加密*/public String encryption(String password){//uuid生成为唯一值String salt= UUID.randomUUID().toString().replace("-","");//将uuid和password经过MD5加密得到密码String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));return salt+"@"+finalPassword;}/*** 解密,并验证密码正确*/public static boolean decrypt(String password,String dbPassword){if (!StringUtils.hasLength(password)||!StringUtils.hasLength(dbPassword)||dbPassword.length()!=65){return false;}String [] dbPasswordArray=dbPassword.split("@");if (dbPasswordArray.length!=2){return false;}//获取唯一的uuidString salt=dbPasswordArray[0];//获取生成的md5的密码String finalDBpassword=dbPasswordArray[1];//通过同样的uuid 和 密码生成出来的值是唯一的。String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));if (finalDBpassword.equals(finalPassword)){return false;}return true;}

设置统一的数据返回格式
设置这个的目的很简单,在开发的时候有很多人,一起开发,使得数据格式会不一样,我们在这里做一个保底策略。
这里我们需要添加一个拦截,将返回出去的数据进行统一的格式规划,这里我用常见的j son 格式
-
ResponseBodyAdvice 接口允许在执行 @ResponseBody 或 ResponseEntity 控制器方法之后,但在使用HttpMessageConverter 写入响应体之前自定义响应,进行功能增强。通常用于 加密,签名,统一数据格式等。
-
instanceof 是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
-
类的实例包含本身的实例,以及所有直接或间接子类的实例
-
instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误
-
注意,这里返回的 object 类,但是对于ResponseBodyAdvice 来说,是没有String类型的说法所以需要自己去判断,不然就会报错
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {//格式生成唯一json格式@Resourceprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {//格式符合要求,就不用转换格式直接返回if (body instanceof ResultAjax){return body;}//格式为String类型,属于特殊类,需要我们手动调换if (body instanceof String){ResultAjax resultAjax=ResultAjax.success(body);try {//将格式转换层json格式,然后返回return objectMapper.writeValueAsString(resultAjax);} catch (JsonProcessingException e) {e.printStackTrace();}}return ResultAjax.success(body);}
}
这里有不明白的可以去看我的博客-----Spring AOP (拦截器)

设置未登录拦截
上述一样不知道原理的可以去看我的 博客 Spring AOP (拦截器)
HandlerInterceptor 和 WebMvcConfigurer搭配使用,前者设置规则,设置拦截的网页
/*** 设置登录拦截规则*/
public class LoginIntercept implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession httpSession=request.getSession(false);if (httpSession!=null&&httpSession.getAttribute(Variable.SESSION_USERINFO_KEY)!=null){return true;}response.sendRedirect("/login.html");return false;}
}
/*** 拦截的网页和资源*/
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercept()).addPathPatterns("/**").excludePathPatterns("/css/*");}
}

设置线程池
这里用的线程池是Spring下的,不用像java本库中的线程池,填入参数,只需要调用set方法写入(不知道线程池可以看我的多线程文章)
@Configuration
public class ThreadPoolUltisConfig {public ThreadPoolTaskExecutor taskExecutor(){ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(10000);executor.setThreadNamePrefix("MyThread-");executor.initialize();return executor;}
}
相关文章:
博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池
博客系统(二) 博客系统获取当前用户的信息对密码进行加密和解密的操作设置统一的数据返回格式设置未登录拦截设置线程池 博客系统 博客系统是干什么的? CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统,这是…...
Postman接口测试工具
Postman接口测试工具 Postman简介Postman 发送一个请求postman创建一个集合Postman 快捷键Postman设置postman请求postman历史postman请求排错postman集合简介postman创建和共享集合postman管理集合postman数据导入导出postman测试脚本postman环境变量和全局变量...
appium+jenkins实例构建
自动化测试平台 Jenkins简介 是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 前面我们已经开完测试脚本,也使用bat 批处…...
c#中字段和属性的区别,委托和事件的区别
IDE眼里的字段和属性 class Test {public int age1 12;public int Age2 { get; set; } 18;public void Show(){Console.WriteLine(age1);Console.WriteLine(Age2);} }很多新人发现在类中定义变量时,有些人会在后面写上get,set。 这种写法定义出来的变量…...
香橙派使用外设驱动库wiringOP来驱动蜂鸣器
硬件接线 回顾香橙派的物理引脚对应: 所以将VCC接到1,GND接到6,I/O口接到7: 代码编写 香橙派的wiringOP库提供了很多的例程,可以将blink.c拷贝进自己的代码文件夹来修改: 小插曲---将手动对齐的Tab和自动对…...
微信小程序Day3笔记
1、页面导航 1. 什么是页面导航 页面导航指的是页面之间的相互跳转。例如:浏览器中实现页面导航的方式有如下两种: <a>链接location.href 2. 小程序中实现页面导航的两种方式: 声明式导航: 在页面上声明一个<navigat…...
大数据技术之Hadoop:提交MapReduce任务到YARN执行(八)
目录 一、前言 二、示例程序 2.1 提交wordcount示例程序 2.2 提交求圆周率示例程序 三、写在最后 一、前言 我们前面提到了MapReduce,也说了现在几乎没有人再写MapReduce代码了,因为它已经过时了。然而不写代码不意味着它没用,当下很火…...
[论文笔记]BiMPM
引言 这又是一篇文本匹配的论文Bilateral Multi-Perspective Matching for Natural Language Sentences阅读笔记。 论文题目为自然语言文本中双向多视角匹配。 提出了BiMPM(bilateral multi-perspective matching)模型: 基于匹配-聚合(比较-聚合)框架; 采用双向匹配提取交…...
JS判断当前是早上,中午,下午还是晚上
<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div></div><script>function getTimeState() {// 获取当前时间let timeNow new Date();// 获取当前小时let…...
使用Docker部署Gitlab的记录
docker版本 使用docker -v查看 Docker version 1.13.1, build 7d71120/1.13.1运行容器镜像 映射本机的9980端口为Docker内部的80端口 映射本机的9922端口为Docker内部的22端口 使用root用户启动 映射本机目录/mnt/sda/gitlab/log为Docker内部的/var/log/gitlab 映射本机目录…...
Spark【Spark SQL(二)RDD转换DataFrame、Spark SQL读写数据库 】
从 RDD 转换得到 DataFrame Saprk 提供了两种方法来实现从 RDD 转换得到 DataFrame: 利用反射机制推断 RDD 模式使用编程方式定义 RDD 模式 下面使用到的数据 people.txt : Tom, 21 Mike, 25 Andy, 18 1、利用反射机制推断 RDD 模式 在利用反射机制…...
LabVIEW检测润滑油中的水分和铁颗粒
LabVIEW检测润滑油中的水分和铁颗粒 润滑油广泛应用于现代机械设备,由于工作环境日益恶劣,润滑油经常被水分乳化,加速对机械设备的腐蚀。此外,润滑油还受到机械零件摩擦中产生的Fe颗粒的污染,削弱了其机械润滑效果。润…...
【新版】系统架构设计师 - 软件架构设计<SOA与微服务>
个人总结,仅供参考,欢迎加好友一起讨论 架构 - 软件架构设计<SOA与微服务> 考点摘要 面向服务SOA(★★★★)微服务(★★★★) 基于/面向服务的(SOA) 在SO…...
React+Typescript+react-router 6 创建路由操作
本文我们来看看路由的安装 其实路由的操作没有什么变化 但是还是给大家讲一下 那么我们打开项目 在项目终端输入 npm install --save react-router react-router-dom安装 一下 react-router 和 react-router-dom 这都是react开发很基本的插件了 不过大家安装前先注意好我的版…...
前端list.push,封装多个对象
js var fruit [apple, banana];fruit.push(pear);console.log(fruit); // [apple, banana, pear]现在为对象 data1:{addUser: 1,editUser: 1,addTime: null,editTime: 1527410579000,userId: 3,systemNo: mc,userName: zengzhuo,userPassword: e10adc3949ba59abbe56e057f20f88…...
指令延迟隐藏
一、指令延迟隐藏 1. 延迟和延迟隐藏 指令延迟指计算指令从调度到指令完成所需的时钟周期如果在每个时钟周期都有就绪的线程束可以被执行,此时GPU处于满符合状态指令延迟被GPU满负荷计算状态所掩盖的现象称为延迟隐藏延迟隐藏对GPU编程开发很重要,GPU设…...
《React vs. Vue vs. Angular:2023年的全面比较》
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
win10自带wifi共享功能
1、按下【wini】组合键打开windows设置,点击【网络和internet】; 2、按照下图,打开个移动热点,设置名称、密码。...
React如何实现国际化?
目录 一、Redux准备工作 commonTypes.js commonActions.js commonReducer.js rootReducer.js 二、然后定义SelectLang组件 index.js index.less 三、创建语言包 welcomeLocale.js index.js 四、使用 react的入口文件 App.js welcome.js 附 关于如何实现国际…...
netrw模拟nerdtree的go命令连续打开多个文件
vim9自带的文件浏览器netrw功能很强大。过去用惯了nerdtree的我,对netrw的文件操作还要适应一些时间。 使用netrw一段时间后发现它没有nerdtree的go命令的替代操作,今天就自制一个。 一、制作go命令: nerdtree的go命令功能:就是…...
3步零编程定制你的Windows系统:Windhawk终极指南
3步零编程定制你的Windows系统:Windhawk终极指南 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk 想要个性化Windows界面却不懂编程ÿ…...
从PCB走线到连接器:手把手教你用ADS仿真优化S参数(避坑SI/PI设计)
从PCB走线到连接器:用ADS仿真优化S参数的实战指南 在高速数字电路和射频设计中,S参数就像设计师的"体检报告",直观反映信号传输路径的健康状况。想象一下,当你设计的PCIe Gen4接口在实验室测试时出现信号完整性问题&am…...
基于树莓派的猫咪智能技能平台:从IoT架构到互动技能实现
1. 项目概述:一个为猫咪设计的智能技能平台 最近在捣鼓智能家居,发现市面上的设备大多是为“两脚兽”设计的,对家里的猫主子来说,要么毫无用处,要么操作复杂。直到我遇到了一个叫 hermesnest/cat-skill 的开源项目&a…...
基于Shell与Python的本地化GPT服务部署与架构实践
1. 项目概述:一个基于Shell与NLP的轻量级GPT服务接口最近在折腾一些自动化脚本和智能对话的集成,发现了一个挺有意思的需求:能不能在命令行里,或者通过一个简单的HTTP请求,就能调用类似GPT这样的语言模型,来…...
终极MifareOneTool使用指南:如何零基础玩转MIFARE经典卡的Windows图形化神器
终极MifareOneTool使用指南:如何零基础玩转MIFARE经典卡的Windows图形化神器 【免费下载链接】MifareOneTool A GUI Mifare Classic tool on Windows(停工/最新版v1.7.0) 项目地址: https://gitcode.com/gh_mirrors/mi/MifareOneTool …...
怎样快速删除背景?2026年免费工具实测对比,找到最简单的抠图方法
图片背景删除已经成为日常工作中的常见需求——无论是制作证件照、电商商品图,还是社交媒体头像,都离不开一个靠谱的背景去除工具。但市面上的工具五花八门,从专业软件到在线应用,从手机App到小程序,到底哪个才是最简单…...
dnSpyEx终极指南:5个技巧快速掌握.NET程序调试与编辑
dnSpyEx终极指南:5个技巧快速掌握.NET程序调试与编辑 【免费下载链接】dnSpy Unofficial revival of the well known .NET debugger and assembly editor, dnSpy 项目地址: https://gitcode.com/gh_mirrors/dns/dnSpy 还在为调试没有源代码的.NET程序而烦恼&…...
把旧路由器改造成远程ADB调试服务器:OpenWrt安装adb与公网访问指南
旧路由器变身远程ADB调试服务器:OpenWrt实战指南 在移动应用开发过程中,频繁连接USB数据线进行调试不仅效率低下,更限制了开发者的工作灵活性。想象一下,当你需要同时调试多台设备,或者在不同网络环境下快速切换测试场…...
如何用TranslucentTB实现Windows任务栏透明化:完整配置指南与性能优化
如何用TranslucentTB实现Windows任务栏透明化:完整配置指南与性能优化 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB Window…...
Kubernetes二进制文件管理器KBM:高效管理kubectl、helm等工具版本
1. 项目概述:为什么我们需要一个Kubernetes二进制文件管理器? 如果你和我一样,长期在多个Kubernetes集群、不同版本的环境之间切换,或者需要为CI/CD流水线、离线环境准备特定版本的 kubectl 、 helm 、 kustomize 等工具&am…...
