心动奶油 - Atanycosts
type: channel
link: https://atanycosts.cn/author/1/
description: Atanycosts
items: 计操
items: Truffle数据上链的文件上传系统
items: 基于SpringBoot的FilePD文件系统
items: Golang学习
items: Magic
items: 学校文件快捷
items: Travel
items: 膳食小搭-推荐算法
items: 实习宝典
items: SpringSecurity

计操
type: item
date: 2024-01-04T20:37:00+08:00
description: 第一套填空go-sdk.zip填空题：进程是一个 动态 的概念，而程序是一个 静态 的概念。在分时操作系统中进程调度经常采用 时间片轮转 算法，设备的独立性是指 应用于程序独立于实际使用的物理设备信箱通信是一种 间接 通信的方式。判断题1、多道程序设定并没有实现利用CPU或者通道进行工作来提高系统的效率 (X)2、银行家算法是一种检测死锁的算法 (X) 一种死锁避免算法3、页是信息的物理单位，段是信息的逻辑单位 (√)4、缺页中断与一般中断没有区别 (X)5、系统调用是由操作系统提供的内部调用，它只能通过用户程序间接使用 (√)简答简答题：1、说明进程的三个基本状态之间的转换的典型原因是什么？（1）处于就绪状态的进程，当进程调度程序为之分配了处理机后，该进程就由就绪状态变为执行状态。 （2）正在执行的进程因发生某事件而无法执行，如暂时无法取得所需资源，则由执行状态转变为阻塞状态。 （3）正在执行的进程，如因时间片用完或被高优先级的进程抢占处理机而被暂停执行，该进程便由执行状态转变为就绪状态。​ (1)就绪状态→执行状态:进程分配到cpu资源 ​ (2)执行状态→就绪状态:时间片用完 ​ (3)执行状态→阻塞状态:i/o请求 ​ (4)阻塞状态→就绪状态:i/o完成2、什么是零界区？进程进入临界区应该遵循的准则是什么？答：每个进程中访问临界资源的那段程序称为临界区（临界资源是一次仅允许一个进程使用的共享资源）。每次只准许一个进程进入临界区，进入后不允许其他进程进入。​ 2>、进程进入临界区的调度原则是：​ ①如果有若干进程要求进入空闲的临界区，一次仅允许一个进程进入。​ ②任何时候，处于临界区内的进程不可多于一个。如已有进程进入自己的临界区，则其它所有试图进入临界区的进程必须等待。​ ③进入临界区的进程要在有限时间内退出，以便其它进程能及时进入自己的临界区。​ ④如果进程不能进入自己的临界区，则应让出CPU，避免进程出现“忙等”现象。计算一.分页1、在一个请求分页系统中，一个长度为5页的进程。假如系统为它分配三个物理块，并且此进程的页面走向2,3,2,1,5,2,4,5,3,2,5,2，试用FIFO和LRU两种算法分别计算出程序访问过程中所发生的缺页次数。fifo:2 3 2 1 5 2 4 5 3 2 5 2 第1页2 2 2 2 5 5 5 5 3 3 3 3 第2页3 3 3 3 2 2 2 2 2 5 5 第3页 1 1 1 4 4 4 4 4 2 f f f f f f f f f 缺页中断次数 = 9lur: 2 3 2 1 5 2 4 5 3 2 5 2 第1页 2 2 2 2 2 2 2 2 3 3 3 3 第2页 3 3 3 5 5 5 5 5 5 5 5 第3页 1 1 1 4 4 4 2 2 2 f f f f f f f 缺页中断次数 = 7二. 非抢占式短进程2、有五个进程（表格：到达时间、执行时间）需要调度执行，如果采用非抢占式短进程调度算法，问这5个进程的平均周转时间是多少？表格进程到达时间执行时间P10.09P20.44P31.01P45.54p572三. 水果3 . 桌上有个能盛得下1个水果的空盘子。爸爸不停地向盘中放苹果，妈妈不停地向盘中放桔子，儿子不停地从盘中取出桔子享用，女儿不停地从盘中取出苹果享用。试用pv原语实现妈妈、爸爸、儿子和女儿进程之间的同步。empty=1,apple=0,orange=0,mutex=1; /*empty表示盘子的剩余量。mutex:是互斥信号，即同一时刻只有一个人能进行放或吃的操作*/ void parent(){ while(1){ p(empty); p(mutex); /放水果； v(mutex); if(放苹果){ v(apple); } if(放橙子){ v(orange); } } } void son(){ while(1){ p(orange); p(mutex); //吃橙子; v(mutex); v(empty); } } void daughter(){ while(1){ p(apple); p(mutex); //吃苹果； v(mutex); v(empty); } } 第二套填空1、系统感知进程存在的唯一标志是 进程控制块(pcb) ；系统感知作业存在的唯一标志 JCB ; 系统感知线程存在的唯一标识为 TCB2、线程之所以能减少并发执行的开销是因为 线程基本不拥有资源 。3、虚拟存储器中仅当系统允许将作业分多次调入内存中并实现将内存中暂时不运行的程序和数据换至台上，而多次性和 对换性 特征必须建立在 离散分配 的基础上。判断1、实时系统高度可靠和安全还必须要求资源利用率高且吞吐量 （X）不要求资源利用率2、两次打开word什么处…

Truffle数据上链的文件上传系统
type: item
date: 2023-12-04T09:34:00+08:00
description: 数据上链的文件上传系统WeBase上链的数据user_Name Stringfile_Name Stringfile_Size Floatfile_Type Stringfile_Hash Stringcreate_Time Dateupdate_Time Date表user表IDuser_Name Stringuser_Account Stringuser_Password Stringuser_Role integer三字段create table user ( ID int auto_increment comment 'ID' primary key, user_Name char(15) not null comment '名称', user_Account char(10) not null comment '账号', user_Password char(20) default '123456' null comment '密码', user_Role tinyint(1) default 1 not null comment '角色' );file表ID Stringuser_Id Stringfile_Name Stringfile_Size Floatfile_Type Stringfile_Hash String三字段create table file ( ID int auto_increment comment 'ID' primary key, user_ID int null comment 'user_ID', file_Name char(20) not null comment '文件名称', file_Size float not null comment '文件大小', file_Type char(10) default '未知' null invisible comment '文件类型', file_Hash char not null comment 'Hash', create_Time datetime not null comment '创建时间', update_Time datetime not null comment '更新时间', is_Delete tinyint(1) default 1 null comment '是否删除', constraint file_user_ID_fk foreign key (user_ID) references user (ID) );链表看返回什么,到时候说

基于SpringBoot的FilePD文件系统
type: item
date: 2023-10-27T09:38:00+08:00
description: 一个随时随地通过FTP上传文件系统基于SpringBoot的FilePD文件系统pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.8</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>demo</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- <dependency>--> <!-- <groupId>com.baomidou</groupId>--> <!-- <artifactId>mybatis-plus-generator</artifactId>--> <!-- <version>3.1.0</version>--> <!-- </dependency>--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <vers…

Golang学习
type: item
date: 2023-09-19T20:05:00+08:00
description: Golang学习马-动态网站开发-复合数据类型.docxGoWeb编程实战派-从入门到精通2.pptxJava转GoGo配置go env高级安装 vscode注意root去运行idea等等 ， go环境变量会失效 ， 需在root权限下重新进bashrc设置用到的命令#没有vim sudo apt install vim #编辑 sudo vim ~/.bashrc #设置环境变量 export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin export GOPROXY=https://goproxy.io,direct #生效 source ~/.bashrc #终端输入goLinux安装Vscodesudo snap install --classic code不出意外 直接code就行打开1 . 基础1.1 包管理1.2 输入1.3 输出1.4 注释1.5 数据类型1.6 变量1.7 常量1.8 条件语句Day1整体package main import ( "awesomeProject/api" "fmt" "math" ) //go关键字 : break、default、func、interface、select、case、defer、 // go、map、struct、chan、else、goto、package、switch、const、 // fallthrough、if、range、type、continue、for、import、return、var /* * 全局常量 */ const Data = 999 const ( pi = 3.1415926 gender = "男" ) func main() { curriculum() gotoFunc(1) } /* * 输出 */ func Scan() { //fmt.Scan函数用于按空格分隔的连续输入，将用户输入的值分配给传递给它的参数。 var x, y int fmt.Scan(&x, &y) //fmt.Scanln函数用于按行读取用户输入， //类似于fmt.Scan，但在读取输入后会自动换行。 var name string var age int fmt.Scanln(&name, &age) //fmt.Scanf函数用于根据指定的格式从输入中读取用户输入。 //您可以使用格式字符串来指定要读取的值的类型和顺序。 fmt.Scanf("%s %d", &name, &age) } /* * 全局与局部变量 */ var number = 99 func bianliang() { //number := 66 //if true { // number := 33 // fmt.Println(number) //33 //} //fmt.Println(number) //66 //number := 66 //if true { // number := 33 // fmt.Println(number) //33 //} //number = 88 //fmt.Println(number) //88 if true { fmt.Println(number) //99 } number = 88 fmt.Println(number) //88 } /* * 上课用的 */ func curriculum() { //map遍历 键值对 m := map[string]int{ "go": 100, "web": 200, "java": 10000, } for key, value := range m { fmt.Println(key, value) } //通道 c := make(chan int) //创建一个整型类型通道 go func() { //启动一个goroutine //顺序表 c <- 7 //将数据推送进通道 c <- 8 c <- 9 close(c) }() for v := range c { fmt.Println(v) } //switch语句 var language = "golang" switch language { case "golang": fmt.Println("并发") case "java": fmt.Println("Popular languages") } /* 声明函数变量 */ getSquareRoot := func(x float64) float64 { return math.Sqrt(x) } fmt.Println(getSquareRoot(9)) //break和continu…

Magic
type: item
date: 2023-09-18T09:27:00+08:00
description: Magic安装解压文件 --> 打开 Clash for Windows.exe开机自启按需选择 ， 其他默认下载成功后会出现一个文件 ， 右键文件可以改名称等等如图选中这个文件会出现一堆地址 ， 导航栏会出现 自动选择 等选项 ，不会就自动选择右键在用得使用选择系统代理就可以上网了

学校文件快捷
type: item
date: 2023-09-13T10:46:00+08:00
description: 区块链原理-实验一.docx# 学校文件快捷word等文件可进预览下载全家桶破解方法一 : 亲测可用https://3.jetbra.in/方法二 :各类文件VMware许可证:​ JU090-6039P-08409-8J0QH-2YR7FGo笔记计网实验一.docx计网第二次实验.docx计网软件-PacketTracer53.rarwin 破解软件.rar合约PPT.rar区块连PPT.rarGoWeb编程实战派-从入门到精通1.pptx《区块链系统搭建与应用》0908.docxAxure-基础教程.docxgame_msgq.rargame-pipe.rarsync.zip动态网站开发技术实验模板.docx58064《计算机操作系统实验指导》源代码.zip.zip全家桶-傻瓜式一键鸡活2023.rar马-计网实验一.docx计网-VLAN及STP实验.docx马-计网-VLAN及STP实验.docx区块链原理-实验一.docx计网实验1018.docx马-计操-进程同步实验.doc计网-静态路由.rar马-GoWeb的Web入门.docx马-区块链实验10.31.docx12.15操作.zip合约安装remixD执行这俩命令,不会报错npm install -g @remix-project/remixd remixd -s C:\Users\Admin\Documents\test --remix-ide https://remix.ethereum.org安装1 . Goland和Vscode安装点击直装 , 无脑下一步VScode下载Goland-2022版本Go安装程序clash-win魔法1.1 . 第一个Go程序go安装后 ,进 cmd 输入 go再将服务器网址一改, 就能完美下包go env -w GOPROXY=https://goproxy.cn根据自己安装的位置设置设置环境变量 , 可以只设置 GOROOT , GOPATH 可以不设置再在path中添加go的bin目录VScode版再打开VsCode , 下载三个插件中文包 : code Runner :go : 随便创个目录, 调出终端 : 快捷键 Ctrl+`package main import "fmt" // 导入内置 fmt func main() { // main函数，是程序执行的入口 fmt.Println("Hello World!") // 在终端打印 Hello World! } 输入 ://根据自己文件名更改 go run 1.goGoland版需要先进行破解 , 如上的有一键破解包未激活示例 : 忘截图了,拿到激活码后,在这里填之后新建项目到自己的目录,直接无脑创建如果没有运行配置,手动创建1.2 . 下载离线帮助文档直接进入bin目录输入cmd回车go install golang.org/x/tools/cmd/godoc@latest godoc -http=:3333 //3333可自定义4位数最后浏览器输入loaclhost:3333 或 127.0.0.1:3333就能打开2 . VMware安装2.1. 基础VMware安装不再阐述 (没找到安装包)上面有许可证,不行的话百度有很多记住自己镜像文件的位置打开虚拟机-->创建-->自定义选择最新的就行再选择稍后安装选择Linux --> Ubuntu64位 -->下一步更改虚拟机名称和位置此位置有相同名称的虚拟机 , 进目录删除就行 然后再点下一步按老师的 处理器:1 核:4 看自己电脑配置 核可以更小一点内存默认就行不使用网络连接I/O默认磁盘默认磁盘大小按需分配 , 注意选择存储为单个文件不管,下一步 --> 完成创建成功后 --> 编辑 --> 首选项只用更改位置就行自己的电脑不用管如下图 , 默认就行之后进入管理删除无用的设备在显示器中关闭加速再引入自己的镜像文件到这个界面按需选择语言选择最小安装填入自己的信息 -->等待安装完成此时如果没有鼠标 请同时按 Ctrl+Alt如此请关闭虚拟机添加网络适配器 -->开机 -->输入密码进入系统2.2 . 安装魔法

Travel
type: item
date: 2023-09-03T19:16:00+08:00
description: Travel储备1 . 攻略储备2 . 物品储备一. 景点篇1 . 观山湖公园介绍 : ​ 开放时间 : 6:00-22:00​ 门票免费 , 电瓶车10r , 5500亩​2 . 黔灵山公园时间 : 过去50分钟左右路线 : 酒店乘坐地铁1号线 国际生态会议中心/阳关站上 八鸽岩C口出3 . 青岩古镇酒店出发有点远机场出发4 . 蓬莱仙界园有点远5 . 白宫(花果山湿地公园)最好从 黔灵山公园 出发 , 白天逛完黔灵山公园晚上去白宫时间 : 50分钟 路线 : 乘坐41/260/320路 黔灵山公园 站上车到 花果山湿地公园6 . 钟书阁(云上方舟商场)理由:贵州喀斯特地貌和溶洞元素设计酒店附近,遨游太空好像也在云上方舟里面7 . 省博和省图省博:​ 时间 : 9:00-17:00 16:00停止入场 周一闭馆 提前十天约就行(人不是很多)​ 国家一级博物馆 免费需预约省图:​ 时间 : 9:00-20:008 . CCpark贵州小威尼斯 , 异国风情二 . 吃喝玩乐篇美食三条街 : 正新街 民生路 蔡家街1 . 贵阳糯米饭2 . 厕所馒头3 . 田孃素粉​ 有宽有细 : 正宗入味就吃细的 不吃辣的就吃脆哨素粉 吃辣的就吃烧椒素粉4 . 脆哨炒饭5 . 安顺小裹卷

膳食小搭-推荐算法
type: item
date: 2023-05-31T22:40:00+08:00
description: 膳食搭配智能平台智能推荐算法的实现与应用智能推荐帖子算法是基于协同过滤算法实现的。​ 基于物品的协同过滤算法 : 给用户推荐与他之前喜欢的物品相似的物品​ 我们通过定义了一张 user_Goods 表来存储用户 , ​ 基于用户的协同过滤算法 : 给用户推荐与他兴趣相似的用户喜欢的物品余弦相似度算法算法编辑距离算法 、Jacquard相似度匹配算法和余弦相似度算法对帖子和方案的标题进行使用 Elasticsearch 框架 中的 IK 分词 : 最细粒度划分标签素食、蛋奶、纯素、低卡、高蛋白、低脂、高纤维、高盐、健康、清真、绿色、糖尿病["素食", "烤鱼", "烤肉", "火锅", "海鲜"]["甜点", "蛋糕", "面包", "冰淇淋", "巧克力"]["早餐", "午餐", "晚餐", "夜宵", "零食"]["酒", "红酒", "啤酒", "白酒", "葡萄酒"]["健康饮食", "减肥", "饮食搭配", "营养均衡", "饮食习惯"]["烹饪", "料理", "烘焙", "调味品", "厨具"]["地方特色美食", "江浙菜", "川菜", "粤菜", "湘菜"]["食材", "蔬菜", "水果", "肉类", "海鲜"]["宵夜", "夜市美食", "街边小吃", "快餐", "烧烤"]["饮品", "茶", "咖啡", "果汁", "饮料"]分词(标签)#分词器测试ik_max_word POST _analyze { "analyzer":"ik_max_word", "text":"我是中国人" }{ "tokens" : [ { "token" : "我", "start_offset" : 0, "end_offset" : 1, "type" : "CN_CHAR", "position" : 0 }, { "token" : "是", "start_offset" : 1, "end_offset" : 2, "type" : "CN_CHAR", "position" : 1 }, { "token" : "中国人", "start_offset" : 2, "end_offset" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "中国", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 3 }, { "token" : "国人", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 } ] }编辑距离算法计算两组最相似的标签@Test public void Test() { List<String> list1 = Arrays.asList("健康", "膳食", "减肥", "健美", "美食"); List<String> list2 = Arrays.asList("美味", "特色", "减肥", "瘦身"); int max = Math.max(list1.size(), list2.size()); double similarity = minDistance(list1, list2); double distance = 1 - similarity / max; System.out.println(distance); // 0.19999999999999996 } public static int minDistance(List<String> tagList1, List<String> tagList2) { int n = tagList1.size(); int m = tagList2.size(); if (n * m == 0) { return n + m; } int[][] d = new int[n + 1][m + 1]; for (int i = 0; i < n + 1; i++) { d[i][0] = i; } for (int j = 0; j < m + 1; j++) { d[0][j] = j; } for (int i = 1; i < n + 1; i++) { for (int j = 1; j < m + 1; j++) { int left = d[i - 1][j] + 1; int down = d[i][j - 1] + 1; int left_down = d[i - 1][j - 1]; if (!Objects.equals(tagList1.ge…

实习宝典
type: item
date: 2023-05-22T18:28:00+08:00
description: 我的面试宝典AIJava框架篇打乱顺序解析 : B D当发现有多种类型的Bean时，@Primary注解会通知IoC容器优先使用它所标注的Bean进行注入；@Quelifier注解可以与@AutoWired注解组合使用，达到通过类型和名称一起筛选Bean的效果。解析 : CSpring MVC 拦截器包含三个方法：preHandle()、postHandle()、afterCompletion()。​ preHandle() 方法：该方方法在控制器方法前执行，其返回值表示是否中断后续操作。当其返回值为true时，表示继续向下执行；当其返回值为false时，会中断后续的所有操作（包括调用下一个拦截器和控制器类中的方法执行等）。 ​ postHandle()方法：该方法在控制器方法调用之后，且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 ​ afterCompletion()方法：该方法在整个请求完成，即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。解析 : Cmethod属性代表指定请求的method的类型，value属性指请求的实际地址，params是指定request中一定要有的参数值。required是@RequestParam注解的属性，是指该参数是否为必传项，默认为true，表示请求中一定要传入对应的参数。解析 : C解析 : A拦截器需实现 HandlerInterceptor 接口，而 WebMvcConfigurer 接口是 MVC 配置类要实现的接口解析 : C 目标方法允许结束后，若发生异常，会先执行异常通知，再执行后置通知。返回通知仅在无异常时执行@Before:Before 通知，用于方法执行前增强 @AfterReturning ：After Returning 通知，方法正常执行返回后增强 @AfterThrowing：After Throwing 通知，方法执行通过抛出异常退出时 @After：After (Finally) 通知，方法执行退出时执行增强，不管是正常返回，还是抛出异常退出，相当于try{}catch{}finally{}中的finally的语句。 @Around：Around 通知，最强大的通知，环绕在目标方法前后执行。它有机会在方法运行之前和之后进行工作，并确定该方法何时、如何以及是否真正开始运行@EnableAutoConfiguration注解解析 : A B C D@EnableAutoConfiguration由@SpringBootApplication引入，它的主要功能是启动Spring应用程序上下文时进行自动配置，它会尝试猜测并配置项目可能需要的Bean。@Import是@EnableAutoConfiguration注解的组成部分，也是自动配置功能的核心实现者。@SpringBootApplication @SpringBootConfiguration @EnableAutoConfiguration @AutoConfigurationPackage @Import(AutoConfigurationPackages.Registrar.class) @Import(AutoConfigurationImportSelector.class) @ComponentScanSpringBoot的核心注解 : @SpringBootApplication注解包含三个注解@SpringBootConfiguration​@EnableAutoConfiguration​ 实现自动配置的关键 , 此注解又包含两个关键注解@AutoConfigurationPackage将主启动类所在包以及子包里面的所有组件扫描并加载到spring的容器中，所以我们开发过程中Controller层、Service层、Dao层的代码总是和主启动类在同一级目录或者次级目录之下。@Import(AutoConfigurationImportSelector.class)来作自动配置至于哪些才是需要自动配置的类呢，AutoConfigurationImportSelector类里面有一个方法selectImports()，该方法通过层层调用，最终会调用一个方法loadSpringFactories()，此方加载所有的spring.factories文件，而spring.factories文件中的数据以（key-value）的形式存储，key就是EnableAutoConfiguration，value自然就是那些需要自动配置的类的全类名了，解析这个文件然后返回需要做自动配置的类的全类名@ComponentScanSpring常用容器解析 :…

SpringSecurity
type: item
date: 2023-05-05T19:09:00+08:00
description: 慢慢更新SpringSecurity的配置方法import com.example.demo.common.GlobalExceptionHandler; import com.example.demo.filter.JwtAuthenticationTokenFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; @Autowired private GlobalExceptionHandler authenticationFailureHandler; //创建BCryptPasswordEncoder注入容器 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http //关闭csrf .csrf().disable() //不通过Session获取SecurityContext .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() // 对于登录接口 允许匿名访问 // .antMatchers("/**").permitAll() .antMatchers("/user/login","/user/register").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and() //其他异常处理 .formLogin() .failureHandler(authenticationFailureHandler) .and() //异常处理 .exceptionHandling() .authenticationEntryPoint((request, response, e) -> { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpStatus.FORBIDDEN.value()); response.getWriter().write("登录失效或未登录"); }) .accessDeniedHandler((…