博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池

news2025/1/16 20:13:46

博客系统(二)

  • 博客系统
  • 获取当前用户的信息
  • 对密码进行加密和解密的操作
  • 设置统一的数据返回格式
  • 设置未登录拦截
  • 设置线程池

博客系统

博客系统是干什么的?
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级)的就够了,毕竟是个小网站。

我规定:

  1. 最终密码生成为65位字符
  2. UUID生成的唯一值与用户所注册的密码合并通过加密工具进行加密。得到一个唯一的值
  3. 将这个唯一的值与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;
        }
        //获取唯一的uuid
        String 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 格式

  1. ResponseBodyAdvice 接口允许在执行 @ResponseBody 或 ResponseEntity 控制器方法之后,但在使用HttpMessageConverter 写入响应体之前自定义响应,进行功能增强。通常用于 加密,签名,统一数据格式等。

  2. instanceof 是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。

    • 类的实例包含本身的实例,以及所有直接或间接子类的实例

    • instanceof左边显式声明的类型与右边操作元必须是同种类或存在继承关系,也就是说需要位于同一个继承树,否则会编译错误

注意,这里返回的 object 类,但是对于ResponseBodyAdvice 来说,是没有String类型的说法所以需要自己去判断,不然就会报错

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    //格式生成唯一json格式
    @Resource
    private ObjectMapper objectMapper;

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public 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;
    }
}

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

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

相关文章

精品基于SpringCloud实现的高校招生信息管理系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的高校招生信息管理系统-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具: 开发语言:Java 框架:springcloud JDK版本&#x…

【环境配置】基于Docker配置Chisel-Bootcamp环境

文章目录 Chisel是什么Chisel-Bootcamp是什么基于Docker配置Chisel-Bootcamp官网下载Docker安装包Docker换源启动Bootcamp镜像常用docker命令 可能产生的问题 Chisel是什么 Chisel是Scala语言的一个库,可以由Scala语言通过import引入。 Chisel编程可以生成Verilog代…

C高级day3(shell指令)

一、Xmind整理: 二、上课笔记整理: 1.定义一个变量,把第11个外部参数的值,赋值给该变量并输出,再输出外部参数的个数 var3${11} echo $var3 echo $# 2.定义一个变量num,使用num获取root用户,…

腾讯事务处理技术验证系统3TS-Coo模板安装文档说明文档(小白向,简单轻松就能上手)

本篇文章将详细说明3TS-Coo模板的安装和使用,帮助您快速上手项目 第一部分是简单的基础Docker相关概念,精炼的几句小白话快速理解即可; 第二部分是快速安装项目环境的安装文档,简单几行命令搞定,小白也能轻松上手&…

12. Xaml Calendar控价 时间控件-->像挂历

1.运行图片 2.运行源码 a.xaml 源码 <Grid Name="Grid1"><!--DisplayMode="Month" 按照什么模式显示DisplayDateStart="2023-2-10" 显示时间的起始时间DisplayDateEnd="2023-8-30" 显示时间的结束时间IsTodayH

MyBatis-Plus-入门操作(1)

MyBatis-Plus-入门操作 2.1常见注解 约定大于配置 mp扫描实体类基于反射的方式作为数据库表的信息。 默认的约定 类名驼峰转下划线名字为id的是主键属性名进行驼峰转换成下划线 要是不遵循约定的话就需要对应的注解进行修改。 表的名字和 实际的表的名字是不一致的 Table…

Scrum看板工具-敏捷看板?

​ 敏捷看板 看板是一个团队共享的工作区&#xff0c;在看板上团队可以进行实时的工作任务协同&#xff0c;团队的工作以卡片的形式体现。通过泳道和任务列表组织管理。需求、任务、问题、缺陷 都作为卡片放在看板上&#xff0c;通过看板实现可视化和透明化的 管理&#xff0…

PHP8中获取并删除数组中第一个元素-PHP8知识详解

我在上一节关于数组的教程&#xff0c;讲的是在php8中获取并删除数组中最后一个元素&#xff0c;今天分享的是相反的&#xff1a;PHP8中获取并删除数组中第一个元素。 回顾一下昨天的知识&#xff0c;array_pop()函数将返回数组的最后一个元素&#xff0c;今天学习的是使用arr…

数据结构 每日一练:选择 + 编程

目录 选择 选择题总结 特殊矩阵的压缩存储 1.对阵矩阵 2.三角矩阵 3.三对角矩阵&#xff08;带状矩阵&#xff09; 编程 选择 1. 设有一个 10 阶的下三角矩阵 A &#xff08;包括对角线&#xff09;&#xff0c;按照行优先的顺序存储到连续的 55 个存储单元中&#xff0c…

vue学习之v-if/v-else/v-else-if

v-else/v-else-if 创建 demo7.html,内容如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docum…

图解 LeetCode 算法汇总——回溯

本文首发公众号&#xff1a;小码A梦 回溯算法是一种常见的算法&#xff0c;常见用于解决排列组合、排列问题、搜索问题等算法&#xff0c;在一个搜索空间中寻找所有的可能的解。通过向分支不断尝试获取所有的解&#xff0c;然后找到合适的解&#xff0c;找完一个分支后再往回搜…

fastadmin的入门

fastadmin入门到完成项目 配置环境 1 运行环境 PHP > 7.2 且 < 7.4 (推荐PHP7.4版本) MySQL > 5.6 且 < 8.0 (需支持innodb引擎) Apache 或 Nginx 使用PHPstudy 运行该项目 写好apache伪静态规则 <IfModule mod_rewrite.c> Options FollowSymlinks -Multi…

什么是自动化测试po模式,po分层如何实现?

目录 一、什么是PO模式 二、什么是自动化测试框架 三、非PO模式和PO模式优缺点对比 四、如何从0到1搭建PO模型 五、自动化测试框架和PO的关系 六、总结 一、什么是PO模式 全称&#xff1a;page object model 简称&#xff1a;POM/PO PO模式最核心的思想是分层&#xf…

[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

目录 preg_replace的/e模式 为什么要变为 {${phpinfo()}} 另一个方法 版本 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo &qu…

蓝桥杯备赛Day8——队列

大家好,我是牛哥带你学代码,本专栏详细介绍了蓝桥杯备赛的指南,特别适合迎战python组的小白选手。专栏以天作为单位,定期更新,将会一直更新,直到所有数据结构相关知识及高阶用法全部囊括,欢迎大家订阅本专栏! 队列也属于基础数据结构。 队列概念 队列是一种数据结构,…

谷粒学院笔记

p37 vscode安装插件 p51 前端技术 vue生命周期 前端debug p57 nodejs介绍 下载后安装 cmd node -v node 01.js 类似java运行class文件 nodejs作为服务器(了解)

树的引进以及二叉树的基础讲解——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 当我们学习完前面的数据结构&#xff0c;难度也就会上升&#xff0c;但是这个也是非常重要的数据结构。今天我们来学习一种新的数据类型——树。 目录 树的概念以及结构 树的概念 树的相关概念 树的表示 树在实…

【项目管理】PM vs PMO 18点区别

导读&#xff1a;项目经理跟PMO主要有哪些区别&#xff1f;首先从定义上了解&#xff0c;然后根据其他维度进行对比分析&#xff0c;基本可以了解这二者的区别&#xff0c;文中罗列18点区别供各位参考。 目录 1、定义 1.1 PMO 1.2 PM 2、两者区别 2.1 ROI 2.2 项目成功率…

Apache HTTPD (CVE-2017-15715)换行解析漏洞复现

Apache HTTPD 换行解析漏洞 CVE-2017-15715漏洞简介 组件版本漏洞名称 Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 漏洞描述 ​ Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&…

微信小程序本地生活(列表页面)

一、实现效果 二、实现步骤 主要实现功能&#xff1a; 页面导航并传参上拉触底时加载下一页数据下拉刷新列表数据 实现步骤 创建列表页面动态设置页面标题定义数据&#xff0c;发起请求获取数据渲染数据并美化样式实现上拉加载数据效果对上拉触底进行节流处理上拉触底请求数…