jwt以及加密完善博客系统

目录

一、背景

二、传统登陆功能&强制登陆功能

1、传统的实现方式

 2、session存在的问题

三、jwt--令牌技术

1、实现过程

2、令牌内容

3、生成令牌

4、检验令牌

四、JWT登陆功能&强制登陆功能

1、JWT实现登陆功能

2、强制登陆功能

3、运行效果

五、加密/加盐

1、加密方式

2、基于MD5的加密

(1)MD5弊端

(2)加盐

(3)生成加密密码

六、博客系统部分代码

一、背景

现已经完成了博客系统的发布博客功能更新博客功能显示博客列表页功能显示详情页功能删除博客功能退出博客登陆功能,还有登陆功能强制登陆功能还未实现。前面已完成的功能主要使用了mybatis的增、改、查等功能,和前面的图书系统较为相似,此处不再做详细介绍,文章结尾附上主要代码。

二、传统登陆功能&强制登陆功能

1、传统的实现方式

客户端输入密码和用户名--->服务器根据用户名去数据库查找密码--->数据库密码和用户密码进行比较--->相同完成登陆并将内容存储在session中--->强制登陆时判断有无session即可。

 2、session存在的问题

但此时这种方法会存在问题:

(1)为了保证项目不因为一个服务器挂了,我们通常会采用多机部署项目,试想一下,若登陆请求我们发送给了服务器1,服务器1正确响应并在内存中保存了session信息,将sessionId通过Cookie发送给客户端。客户端在登陆的前提下带着SessionId再次进行其他请求,此时若将请求发送给了服务器2,服务器2根据sessionId查找session信息,发现服务器2没有保存,此时就会认为客户端未登陆,但其实客户端在服务器1上已经登陆了。session实现强制登陆时,不能满足多机部署。

(2)在重启服务器时,session信息就没了,若用户刚登录服务器重启了,此时就会要求用户重新登陆,带来不好的用户体验。

(3)用户的session信息都保存在服务器内存中,若用户很多,session信息就多,占用的内存就大,导致服务器挂掉的风险也大。

三、jwt--令牌技术

1、实现过程

客户端输入密码和用户名--->服务器根据用户名去数据库查找密码--->数据库密码和用户密码进行比较--->相同完成登陆并给客户端一个令牌--->强制登陆时服务器判断有无令牌即可,且令牌内容不能改变,若改变就失效了。

2、令牌内容

令牌包含三部分的内容:

(1)Header---头部

头部包含jwt使用的算法(如HS256)以及jwt的类型。

(2)Payload---负载

负载是存放有效信息的地方,类似session,可以自定义,也可以存放令牌过期时间。此部分可以解码还原原始内容。

(3)Signature---签名

签名部分可以防止jwt内容被篡改,签名是基于头部和载荷计算得出的,同时也使用了安全密钥进行加密,若jwt中任何一个字符改变,进行验证时以同样的密钥签名头部和载荷,发现两次签名不同,就会导致令牌失效。jwt的内容可以公布,不是进行了加密,而是保证了唯一性,防止被篡改。(类似于身份证)。

3、生成令牌

先引入依赖:

生成的jwt内容为:

eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJsaXNpIiwiaWF0IjoxNzEwNTc2NjcwLCJleHAiOjE3MTA1ODAyNzB9.FQQTi586Wp_9S-tCjO1rmHhHqSuFWdkXF3KlLcotgFU

解析该jwt:

4、检验令牌

运行结果:

只要结果不为空就表明令牌是正确的。

四、JWT登陆功能&强制登陆功能

1、JWT实现登陆功能

后端处理:

前端请求+响应:

2、强制登陆功能

使用拦截器进行强制登陆,判断用户令牌是否正确。从本地存储中拿出令牌放在请求header中,根据拿到的内容判断是否能拿到负载内容。

由于每个页面都要进行强制登陆判断,所以将从本地存储中拿出令牌放在请求header中的操作统一放在common.js中,且要在发送请求前放在header中:

3、运行效果

此时就能正确显示博客列表页了。

五、加密/加盐

对于数据库中的敏感信息:例如密码等,需要对其加密,不然黑客入侵后就会获取到用户的密码,造成一定的损失。

1、加密方式

(1)对称加密

对于明文的加密和密文的解密使用的是同一种密钥。常见算法有:AES,DES,3DES,RC4,RC5,RC6

(2)非对称加密

明文的加密采用公钥,密文的解密采用私钥。公钥可以公开,私钥不可以公开。常见算法有:RSA,DSA,ECDSA,ECC;

(3)摘要加密

将任意长度的明文转为固定长度的数据,不可逆,无法解密。对于相同的明文,进行摘要加密后结果相同。常见算法有:MD5,SHA1,SHA2,CRC。

2、基于MD5的加密
(1)MD5弊端

博客系统采用MD5加密方式,将密码转换为固定长度的数据。但只使用MD5存在弊端:

①虽然MD5不可逆,但对于密码较短的,可以借助工具进行解密;

②密码一样的用户,MD5转换后是一样的,一旦一个用户暴露,其他也会暴露。

(2)加盐

可以对于密码加上固定长度的随机值(盐值),明文+盐值---->进行MD5加密。

还需考虑一个问题:在进行验证时,我们如何拿到盐???

可以将盐值插入在MD5加密后的数据里,验证时分离出加密结果和盐值即可。

为了简单:我们就直接将盐值拼接在加密结果后面了。

(3)生成加密密码

将数据库修改为:

进行登陆验证:

六、博客系统部分代码

1、登陆功能

(1)客户端请求+响应

(2)服务器响应

2、展示博客列表功能

(1)客户端请求+响应

(2)服务器响应

3、展示博客详情功能

(1)客户端请求+响应

(2)服务器响应

4、更新博客功能

(1)客户端请求+响应

(2)服务器响应

5、删除博客功能

(1)客户端请求+响应

(2)服务器响应

6、发布博客功能

(1)客户端请求+响应

(2)服务器响应

7、退出博客登陆

8、强制登陆功能

若需要全部源码,可以进入:葛雅宁 (ge-yaning) - Gitee.com

点击java学习下的基于spring下的博客管理系统:

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

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

相关文章

C++之多态

目录 1、为什么要用多态? 2、虚函数的定义 3、虚函数的实现机制 4、哪些函数不能被设置为虚函数? 5、虚函数的访问 5.1、指针访问 5.2、引用访问 5.3、对象访问 5.4、成员函数中访问 5.5、构造函数和析构函数中访问 6、纯虚函数 7、抽象类 …

串变换dfs

分析&#xff1a; DFS,注意判断是否遍历结束&#xff0c;返回false 代码示例&#xff1a; #include<bits/stdc.h> using namespace std; int n,k; string s,t; struct {int op;int x;int y; }cha[10]; int vis[10]; bool dfs(int dep){if(st)return true;if(depk1)retu…

Qt教程 — 3.3 深入了解Qt 控件:Input Widgets部件(2)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 QSpinBox组件-窗口背景不透明调节器 2.2 DoubleSpinBox 组件-来调节程序窗口的整体大小 2.3 QTimeEdit、QDateEdit、QDateTimeEdit组件-编辑日期和时间的小部件 Input Widgets部件部件较多&#xff0c;将分为三…

滑动窗口最大值(leetcode hot100)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…

C++:菱形继承与虚继承

看下面这个示例代码 class A{ public: int num10; A(){cout<<"A构造"<<endl;} virtual void fun(){cout<<"A虚函数"<<endl;} };class B:public A{ public: B(){cout<<"B构造"<<endl;} void fun(){cout<…

基于Matlab的车牌识别算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

高可用系统有哪些设计原则

1.降级 主动降级&#xff1a;开关推送 被动降级&#xff1a;超时降级 异常降级 失败率 熔断保护 多级降级2.限流 nginx的limit模块 gateway redisLua 业务层限流 本地限流 gua 分布式限流 sentinel 3.弹性计算 弹性伸缩—K8Sdocker 主链路压力过大的时候可以将非主链路的机器给…

telnet命令使用

window启用telnet telnet命令连接服务端 启动netty服务端后&#xff0c;使用如下cmd命令连接服务端&#xff0c;按enter&#xff0c;将连接到netty服务端 再按CTRL ]&#xff0c;进入命令交互界面 输入 help&#xff0c;查看命令介绍 发送消息&#xff0c;再断开连接&…

一起学数据分析_2

写在前面&#xff1a;代码运行环境为jupyter&#xff0c;如果结果显示不出来的地方就加一个print()函数。 一、数据基本处理 缺失值处理&#xff1a; import numpy as np import pandas as pd#加载数据train.csv df pd.read_csv(train_chinese.csv) df.head()# 查看数据基本…

Python环境安装及Selenium引入

Python环境安装 环境下载 Download Python | Python.org 环境安装 需使用管理员身份运行 查看环境是否安装成功 python --version 如果未成功则检查环境变量配置 安装 Selenium 库 pip install selenium Selenium 可以模拟用户在浏览器中的操作&#xff0c;如点击按钮、填写…

Springboot 整合 Elasticsearch(五):使用RestHighLevelClient操作ES ②

&#x1f4c1; 前情提要&#xff1a; Springboot 整合 Elasticsearch&#xff08;三&#xff09;&#xff1a;使用RestHighLevelClient操作ES ① 目录 一、Springboot 整合 Elasticsearch 1、RestHighLevelClient API介绍 1.1、全查询 & 分页 & 排序 1.2、单条件查询…

接口幂等性问题和常见解决方案

接口幂等性问题和常见解决方案 1.什么是接口幂等性问题1.1 会产生接口幂等性的问题1.2 解决思路 2.接口幂等性的解决方案2.1 唯一索引解决方案2.2 乐观锁解决方案2.3 分布式锁解决方案2.4 Token解决方案(最优方案) 3 Token解决方案落地3.1 token获取、token校验3.2 自定义注解,…

java过滤器Filter相关知识点汇总

1.Filter概述 Servlet Filter又称Servlet过滤器&#xff0c;它是在Servlet2.3规范中定义的&#xff0c;能够对Servlet容器传给Web资源的request对象和response对象执行检查和修改。 Filter不是Servlet&#xff0c;不能直接访问&#xff0c;其本身也不能生成request对象和resp…

第十三届蓝桥杯(C/C++ 大学B组)

目录 试题 A: 九进制转十进制 试题 B: 顺子日期 试题 C: 刷题统计 试题 D: 修剪灌木 试题 E: X 进制减法 试题 F: 统计子矩阵 试题 G: 积木画 试题 H: 扫雷 试题 I: 李白打酒加强版 试题 J: 砍竹子 试题 A: 九进制转十进制 九进制正整数 ( 2022 )转换成十进制等于多…

Java后端面试经验分享,~纯分享

本文将从面试、工作、学习三个方面分享最近面试的一些心得以及以后发展的一些规划&#xff0c;仅供参考&#xff0c;哈哈&#xff0c;毕竟本人也很菜&#xff0c;因为菜才要多学习。一会儿也会分享两本Java面试题库&#xff08;题库是b站大学找的&#xff0c;一会儿我也会分享出…

开发知识点-python-Tornado框架

介绍 Tornado是一个基于Python语言的高性能Web框架和异步网络库&#xff0c;它专注于提供快速、可扩展和易于使用的网络服务。由于其出色的性能和灵活的设计&#xff0c;Tornado被广泛用于构建高性能的Web应用程序、实时Web服务、长连接的实时通信以及网络爬虫等领域。 Torna…

java组合模式揭秘:如何构建可扩展的树形结构

组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示整体/部分层次结构。组合模式使得客户端可以统一对待单个对象和组合对象&#xff0c;从而使得客户端可以处理更复杂的结构。 组合模式的主要组成部分包括&…

spring boot3登录开发-微信小程序用户登录设计与实现

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 登录流程 流程解析 具体实现 相关代码 说明 服务端 小程序端 写在最后 写在前面 本文介绍了springb…

20双体系Java学习之数组的toString类

Arrays.toString ★小贴士 数组内容字符串表示形式由数组的元素列表组成&#xff0c;括在方括号&#xff08;"[]"&#xff09;中。相邻元素用字符 ", "&#xff08;逗号加空格&#xff09;分隔。 使用toString()方法可方便地输出数组的内容&#xff0c;避免…

前端跨平台开发框架:简化多端开发的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…