news 2026/6/2 21:07:06

【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现

文章目录

    • 项目业务层
    • 一、实现发布博客
      • 1.1 编辑器组件
    • 二、实现修改博客
    • 三、实现删除博客
    • 四、加密/加盐
      • 4.1 加密介绍
      • 4.2 密码算法分类
      • 4.3 加密实现

项目业务层

在前两个博文中,已经实现了一些功能,该篇将继续处理剩下的功能。

一、实现发布博客

  1. 约定前后端交互接口
    好的,我帮你把这个接口整理成规范的接口文档格式,包含核心的请求和响应信息:

基本信息

  • 接口地址/blog/add
  • 请求方式POST
  • 接口描述:用于新增一篇博客文章

请求参数

参数名类型是否必填说明
userIdNumber发布用户ID
titleString博客标题
contentString博客正文内容

请求示例

{"userId":1,"title":"标题","content":"正文"}
  1. 实现Controller 层

因为请求参数需要对应的实体类和数据库中对应的实体类不一致,因此需要额外处理一个接口实体类并进行数据转换。且保证接口对应实体属性不为空。

接口:

@PostMapping("/add")publicResultaddBlogInfo(@Validated@RequestBodyAddBlogRequestaddBlogRequest){log.info("发布博客,request:{}",addBlogRequest);returnResult.ok(blogService.addBlogInfo(addBlogRequest));}
  1. 实现Service 层
@OverridepublicBooleanaddBlogInfo(AddBlogRequestaddBlogRequest){BlogInfoblogInfo=BeanTransUtils.transBlogInfo(addBlogRequest);try{blogInfoMapper.insert(blogInfo);returntrue;}catch(Exceptione){thrownewBlogException("博客发布失败");}}

数据处理抽取为公共模块处理,代码和前两个章节中基本一致。

1.1 编辑器组件

发布博客使用的编辑器使用editor.md 进行编辑,是一个开源的页面markdown组件。
官网详见:http://editor.md.ipandao.com/

使用时引入对应依赖即可。

测试发布,结果可正常进行博文的发布:

二、实现修改博客

功能:当进入用户详情页时,如果当前登录用户正是文章作者,则在导航栏中显示编辑和删除按钮,点击进行对应处理。

  1. 约定前后端交互接口

基本信息

  • 接口地址/blog/update
  • 请求方式POST
  • Content-Typeapplication/json
  • 接口描述:用于更新一篇已存在的博客文章

请求参数

参数名类型是否必填说明
idString博客文章ID
titleString博客标题
contentString博客正文内容

请求示例

{"id":"4","title":"测试修改文章","content":"在这里写下一篇博客"}
  1. 实现 Controller 层
@PostMapping("/update")publicBooleanupdateBlog(@Validated@RequestBodyUpdateBlogRequestupdateBlogRequest){log.info("修改博客,request:{}",updateBlogRequest);returnblogService.updateBlog(updateBlogRequest);}
  1. 实现Service 层
@OverridepublicBooleanupdateBlog(UpdateBlogRequestupdateBlogRequest){BlogInfoblogInfo=BeanTransUtils.transUpdateBlogInfo(updateBlogRequest);try{inti=blogInfoMapper.updateById(blogInfo);returni==1;}catch(Exceptione){thrownewBlogException("博客更新失败");}}

数据转换同上。

在前端进行判断处理是否需要显示对应的编辑和删除按钮。

三、实现删除博客

  1. 约定前后端交互接口

基本信息

  • 接口地址/blog/delete
  • 请求方式GET/POST
  • 接口描述:用于删除指定的博客文章

请求参数

参数名类型是否必填说明
blogIdNumber要删除的博客ID

请求示例

/blog/delete?blogId=1
  1. 实现Controller 层
@PostMapping("/delete")publicBooleandeleteBlog(@NotNullIntegerblogId){log.info("删除博客,blogId:{}",blogId);returnblogService.deleteBlog(blogId);}
  1. 实现Service 层
@OverridepublicBooleandeleteBlog(IntegerblogId){BlogInfoblogInfo=newBlogInfo();blogInfo.setId(blogId);blogInfo.setDeleteFlag(Constants.IS_DELETE);try{inti=blogInfoMapper.updateById(blogInfo);returni==1;}catch(Exceptione){thrownewBlogException("博客删除失败");}}

验证测试发现博文可以正确被对应的用户作者删除。

四、加密/加盐

4.1 加密介绍

在MySQL数据库中,需要对密码,身份证号,手机号等敏感信息进行加密,以保证数据的安全性。

如果使用明文存储,当黑客入侵了数据库时,就可以轻松获取到用户的相关信息,从而对用户或者企业造成信息泄漏或者财产损失。

目前用户的密码还是明文设置的,为了保护用户的密码信息,需要对密码进行加密

4.2 密码算法分类

密码算法主要分为三类:对称密码算法,非对称密码算法,摘要算法。

  1. 对称密码算法是指加密秘钥和解密秘钥相同的密码算法。常见的对称密码算法有:AES, DES, 3DES, RC4, RC5, RC6 等。

  2. 非对称密码算法是指加密秘钥和解密秘钥不同的密码算法。该算法使用一个秘钥进行加密,用另外一个秘钥进行解密。

    • 加密秘钥可以公开,又称为公钥
    • 解密秘钥必须保密,又称为私钥
      常见的非对称密码算法有:RSA, DSA, ECDSA, ECC 等
  3. 摘要算法是指把任意长度的输入消息数据转化为固定长度的输出数据的一种密码算法。摘要算法是不可逆的,也就是无法解密。通常用来检验数据的完整性的重要技术,即对数据进行哈希计算然后比较摘要值,判断是否一致。常见的摘要算法有:MD5, SHA系列(SHA1, SHA2等), CRC(CRC8, CRC16, CRC32)

根据上述也可以将密码算法分为两类:可逆密码算法和不可逆密码算法。

4.3 加密实现

问题:虽然经过MD5加密后的密文无法解密,但由于相同的密码经过MD5哈希之后的密文是相同的,当存储用户密码的数据库泄露后,攻击者会很容易便能找到相同密码的用户,从而降低了破解密码的难度。因此,在对用户密码进行加密时,需要考虑对密码进行包装,即使是相同的密码,也保存为不同的密文。即使用户输入的是弱密码,也考虑进行增强,从而增加密码被攻破的难度。

解决方案:采用为一个密码拼接一个随机字符来进行加密,这个随机字符我们称之为“盐”。假如有一个加盐后的加密串,黑客通过一定手段这个加密串,他拿到的明文并不是加密前的字符串,而是加密前的字符串和盐组合的字符串,这样相对来说又增加了字符串的安全性。

解密流程:MD5是不可逆的,通常采用“判断哈希值是否一致”来判断密码是否正确。

如果用户输入的密码,和盐值一起拼接后的字符串经过加密算法,得到的密文相同,我们就认为密码正确(密文相同,盐值相同,推测明文相同)


此处的Md5实现使用的是Spring 提供的工具类实现的。随机盐值使用UUID进行生成。

加密工具类:

publicclassMd5Utils{/** * Md5加密 */publicstaticStringenrypt(Stringpassword){// 获取盐值Stringsalt=UUID.randomUUID().toString().replace("-","");// 获取Md5密文StringsecretPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));returnsalt+secretPassword;}/** * 验证密码 */publicstaticBooleanverify(StringinputPassword,StringsqlPassword){if(!StringUtils.hasLength(sqlPassword)||!StringUtils.hasLength(inputPassword)){returnfalse;}if(sqlPassword.length()!=Constants.MD5_LENGTH){returnfalse;}// 用户输入的密文Stringsalt=sqlPassword.substring(0,32);StringsecretPassword=DigestUtils.md5DigestAsHex((salt+inputPassword).getBytes(StandardCharsets.UTF_8));returnsqlPassword.equals(salt+secretPassword);}}

使用测试类给密码123456进行密文的生成,32位密文与32位盐值组合在一起为存放的密文:d265f60759754a10af8f8228675f5ef4911d9c50298afddaa4dc49af0a353881

至此整个博客系统可以算是小成了,但还是有很多功能可以进行开发,不断完善。后续将会不断添加新的功能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 5:14:00

Matplotlib 绘图线

Matplotlib 绘图线 引言 Matplotlib 是一个功能强大的 Python 库,用于创建高质量的 2D 和 3D 图形。在数据分析、数据可视化等领域,Matplotlib 凭借其灵活性和易用性,成为了数据科学家和工程师的必备工具。本文将详细介绍 Matplotlib 中绘制线图的方法,包括基本概念、常用…

作者头像 李华
网站建设 2026/6/1 7:26:43

双喷嘴挡板电液伺服阀故障诊断方法研究

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅成品或者定制,扫描文章底部微信二维码。1)伺服阀数学建模与典型故障机理分析双喷嘴挡板电液伺服阀的工作过程涵盖…

作者头像 李华
网站建设 2026/5/30 12:28:40

Shell test 命令详解

Shell test 命令详解 引言 Shell 是一种常用的命令行解释器,用于执行操作系统中的命令。在 Shell 编程中,test 命令是一个非常基础的命令,它主要用于条件测试。本文将详细介绍 test 命令的用法、参数、返回值以及与其他命令的结合使用。 一、test 命令的基本用法 test 命…

作者头像 李华
网站建设 2026/5/31 2:12:06

GPU 是怎么从 VBO 读顶点数据、按 VAO 的“说明书”把它拼成顶点着色器能吃的“结构化输入”的?——用大白话讲清楚这一口“顶点数据”到底怎么喂进去

你学 OpenGL 或 OpenGL ES 的时候,最容易被一堆缩写绕晕:VBO、VAO、VertexAttribPointer、layout(location=0)… 然后你照着教程抄完,屏幕上出个三角形,你心里只有一句: “我好像成功了,但我完全不知道为啥。” 尤其是这一步最魔幻: 你明明只是把一串 float 塞进了 VBO,…

作者头像 李华
网站建设 2026/5/28 15:18:49

【计算机毕业设计案例】基于springboot的养老院预约系统基于微信小程序的养老院系统的设计与实现(程序+文档+讲解+定制)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华