【Java-框架-SpringSecurity】单点登录(认证和授权)- 随笔

项目文件;

【1】

预览

在这里插入图片描述

文件

文件01

名称

  • pom.xml

内容

  • (01)总的

    <?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.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>SpringDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringDemo</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
    </project>
    
  • (02)依赖1

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  • (03)依赖2

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
    </dependency>
    
文件02

名称

  • DemoController.java

内容

  • (01)总的

    package com.example.springdemo.controller;import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class DemoController {@GetMapping("demo_a")public String demo_a() {System.out.println("【DemoController.demo_a】......");return "This is demo_a method......";}@GetMapping("demo_b")public String demo_b() {System.out.println("【DemoController.demo_b】......");return "This is demo_b method......";}}
    
  • (02)方法1

    @GetMapping("demo_a")
    public String demo_a() {System.out.println("【DemoController.demo_a】......");return "This is demo_a method......";
    }
    
  • (03)方法2

    @GetMapping("demo_b")
    public String demo_b() {System.out.println("【DemoController.demo_b】......");return "This is demo_b method......";
    }
    

【2】

预览

在这里插入图片描述

文件

文件01

名称

  • pom.xml

内容

  • (01)总的

    <?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.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>SpringDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringDemo</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
    </project>
    
  • (02)依赖1

    <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version>
    </dependency>
    
文件02

名称

  • application.properties

内容

  • (01)总的

    # 开启Knife4j增强模式
    knife4j.enable=true
    
文件03

名称

  • Knife4jConfiguration.java

内容

  • (01)总的

    package com.example.springdemo.config;import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;/*** Knife4j配置类** @author SUNxRUN*/
    @Configuration
    @EnableSwagger2WebMvc
    public class Knife4jConfiguration {/*** 【重要】指定Controller包路径*/private String basePackage = "com.example.springdemo.controller";/*** 分组名称*/private String groupName = "略";/*** 【主页】题目*/private String title = "在线API文档";/*** 【主页】简介*/private String description = "前后交互";/*** 【主页】作者*/private String contactName = "SUNxRUN";/*** 【主页】版本*/private String version = "1.0.0";/*** 【主机】host*/private String host = "http://localhost:9081";/*** 【主页】服务URL*/private String termsOfServiceUrl = "http://www.apache.org/licenses/LICENSE-2.0";/*** 联系网址*/private String contactUrl = "略";/*** 联系邮箱*/private String contactEmail = "略";@Autowiredprivate OpenApiExtensionResolver openApiExtensionResolver;public Knife4jConfiguration() {System.out.println("【配置类】Knife4jConfiguration-----已运行");}@Beanpublic Docket docket() {String groupName = "1.0.0";Docket docket = new Docket(DocumentationType.SWAGGER_2).host(host).apiInfo(apiInfo()).groupName(groupName).select().apis(RequestHandlerSelectors.basePackage(basePackage)).paths(PathSelectors.any()).build().extensions(openApiExtensionResolver.buildExtensions(groupName));return docket;}private ApiInfo apiInfo() {return new ApiInfoBuilder().title(title).description(description).termsOfServiceUrl(termsOfServiceUrl).contact(new Contact(contactName, contactUrl, contactEmail)).version(version).build();}}
    

【3】

预览

在这里插入图片描述

文件

文件01

名称

  • pom.xml

内容

  • (01)总的

    <?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.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>SpringDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringDemo</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
    </project>
    
  • (02)依赖1

    <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
    </dependency>
    
文件02

名称

  • JwtTests.java

内容

  • (01)总的

    package com.example.springdemo;import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.junit.jupiter.api.Test;import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;public class JwtTests {@Testpublic void testGenerateJwt() {// 准备`claims`Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("name", "SUNxRUN");// 准备`过期时间(设置:10年)`Date expirationDate = new Date(System.currentTimeMillis() + 525600 * 10 * 60 * 1000);// 准备`密钥`String secretKey = "1234567890";// JWT的组成部分:Header(头)、Payload(载荷)、Signature(签名)String jwt = Jwts.builder()// Header:用于配置算法与此结果数据的类型// 通常配置两个属性:tye(类型)、alg(算法).setHeaderParam("typ", "jwt").setHeaderParam("alg", "HS256")// Payload:用于配置需要封装到JWT中的数据.setClaims(claims).setExpiration(expirationDate)// Signature:用于指定算法与密钥(盐).signWith(SignatureAlgorithm.HS256, secretKey).compact();System.out.println(jwt);}@Testpublic void testParseJwt() {// `密钥`String secretKey = "1234567890";// `JWT`String jwt = "eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiU1VOeFJVTiIsImlkIjoxLCJleHAiOjE3MDc0NzcyNDR9.stHmCODCatUhNQ6M9_tYQfR4ay0rRd0wQIMZgYXKyhY";Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();Object id = claims.get("id");System.out.println("id=" + id);Object name = claims.get("name");System.out.println("name=" + name);}}
    
  • 方法1

    @Test
    public void testGenerateJwt() {// 准备`claims`Map<String, Object> claims = new HashMap<>();claims.put("id", 1);claims.put("name", "SUNxRUN");// 准备`过期时间(设置:10年)`Date expirationDate = new Date(System.currentTimeMillis() + 525600 * 10 * 60 * 1000);// 准备`密钥`String secretKey = "1234567890";// JWT的组成部分:Header(头)、Payload(载荷)、Signature(签名)String jwt = Jwts.builder()// Header:用于配置算法与此结果数据的类型// 通常配置两个属性:tye(类型)、alg(算法).setHeaderParam("typ", "jwt").setHeaderParam("alg", "HS256")// Payload:用于配置需要封装到JWT中的数据.setClaims(claims).setExpiration(expirationDate)// Signature:用于指定算法与密钥(盐).signWith(SignatureAlgorithm.HS256, secretKey).compact();System.out.println(jwt);
    }
    
  • 方法2

    @Test
    public void testParseJwt() {// `密钥`String secretKey = "1234567890";// `JWT`String jwt = "eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiU1VOeFJVTiIsImlkIjoxLCJleHAiOjE3MDc0NzcyNDR9.stHmCODCatUhNQ6M9_tYQfR4ay0rRd0wQIMZgYXKyhY";Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();Object id = claims.get("id");System.out.println("id=" + id);Object name = claims.get("name");System.out.println("name=" + name);
    }
    

【4】

预览

在这里插入图片描述

文件

文件01

名称

  • pom.xml

内容

  • (01)总的

    <?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.5.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>SpringDemo</artifactId><version>0.0.1-SNAPSHOT</version><name>SpringDemo</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.9</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
    </project>
    
  • (02)依赖1

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    

【5】

预览

在这里插入图片描述

文件

文件01

名称

  • BCryptTests.java

内容

  • (01)总的

    package com.example.springdemo;import org.junit.jupiter.api.Test;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;public class BCryptTests {@Testpublic void testBCrypt() {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();String rawPassword = "123456";String encodedPassword = passwordEncoder.encode(rawPassword);System.out.println(encodedPassword);}}
    
  • (02)方法1

    @Test
    public void testBCrypt() {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();String rawPassword = "123456";String encodedPassword = passwordEncoder.encode(rawPassword);System.out.println(encodedPassword);
    }
    
文件02

名称

  • UserDetailsServiceImpl.java

内容

  • (01)总的

    package com.example.springdemo.security;import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.core.userdetails.UsernameNotFoundException;
    import org.springframework.stereotype.Service;@Service
    public class UserDetailsServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {System.out.println("`Spring Security`会自动根据用户名查询用户详情!【用户名】:" + s);if ("LinShiYongHu".equals(s)) {UserDetails userDetails = User.builder().username("LinShiYongHu").password("$2a$10$sgbF5BycuObR79id8Y08U.Mg.YAMJCU2TPBqzSUqu5zg401iGMUcu") // 密码:123456.disabled(false) // 账号是否禁用.accountLocked(false) // 账号是否锁定.accountExpired(false) // 账号是否过期.authorities("权限信息,暂不处理!") // 账号的权限信息.build();return userDetails;}return null;}}
    
  • (02)方法1

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {System.out.println("`Spring Security`会自动根据用户名查询用户详情!【用户名】:" + s);if ("LinShiYongHu".equals(s)) {UserDetails userDetails = User.builder().username("LinShiYongHu").password("$2a$10$sgbF5BycuObR79id8Y08U.Mg.YAMJCU2TPBqzSUqu5zg401iGMUcu") // 密码:123456.disabled(false) // 账号是否禁用.accountLocked(false) // 账号是否锁定.accountExpired(false) // 账号是否过期.authorities("权限信息,暂不处理!") // 账号的权限信息.build();return userDetails;}return null;
    }
    
文件03

名称

  • SecurityConfiguration.java

内容

  • (01)总的

    package com.example.springdemo.config;import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
    public class SecurityConfiguration {@Beanpublic PasswordEncoder passwordEncoder() {System.out.println("创建密码编辑器组件:BCryptPasswordEncoder......");return new BCryptPasswordEncoder();}}
    
  • (02)方法1

    @Bean
    public PasswordEncoder passwordEncoder() {System.out.println("创建密码编辑器组件:BCryptPasswordEncoder......");return new BCryptPasswordEncoder();
    }
    

【6】

在这里插入图片描述

【7】

在这里插入图片描述

【8】

在这里插入图片描述

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

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

相关文章

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器 点击button按钮触发事件显示月份与获取的时间 Button button3 (Button) findComponentById(ResourceTable.Id_button3);button3.setClickedListener(new Component.ClickedListener() {Overridepublic void onClick(Compon…

【趣味CSS3.0】粘性定位属性Position:sticky是不是真的没用了?

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…

Webpack5 基本使用 - 2

常用 loader loader 是辅助打包工具。webpack 默认只能打包 js 文件&#xff0c;打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。loader 可以将文件从不同的语言转换为 JavaScript。一类文件如果需要多个 loader 处理&#xff0c;loader 的执行顺序是从…

SQL注入 ---> Day1 !

终于&#xff0c;我的课程开始讲SQL注入了&#xff0c;对就是那个常年在OWASP上有名的SQL注入 今天是真的冷啊&#xff0c;幸苦的小编还在写csdn 1.SQL注入原理 SQl注入其实就是将恶意的代码向服务器提交&#xff0c;但是后端又不过滤而引发的漏洞&#xff0…

2、Line Charts折线图

可视化时间趋势 现在你已经熟悉了编码环境,是时候学习如何制作自己的图表了! 在本教程中,您将学习足够的Python来创建专业外观的折线图。然后,在接下来的练习中,您将使用您的最新技能处理真实世界的数据集。 本课程数据集夸克网盘下载链接:https://pan.quark.cn/s/a235ac…

让二叉树无处可逃

志不立&#xff0c;天下无可成之事。 ——王阳明 二叉树 1、树&#xff1f;什么是树1、1、基本概念1、2、树的相关概念1、3、树的表示方式1、4、树的实际运用 2、二叉树&#xff1f;只有两个分支吗&#xff1f;2、1、基本概念2、2、二叉树的相关定义2、3、二叉树的相关性质2、4…

flutter获取地理定位:geolocator依赖详细用法

本文使用geolocator插件实现app物理定位功能。 该插件的主要功能有&#xff1a; 获取最后已知位置&#xff1b;获取设备当前位置&#xff1b;获取连续的位置更新&#xff1b;检查设备是否启用了定位服务&#xff1b;计算两个地理坐标之间的距离&#xff08;米&#xff09;&am…

Python基础第九篇(Python可视化的开发)

文章目录 一、json数据格式&#xff08;1&#xff09;.转换案例代码&#xff08;2&#xff09;.读出结果 二、pyecharts模块介绍三、pyecharts模块入门&#xff08;1&#xff09;.pyecharts模块安装&#xff08;2&#xff09;.pyecharts模块操作&#xff08;1&#xff09;.代码…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…

第二证券:大金融板块逆势护盘 北向资金尾盘加速净流入

周一&#xff0c;A股商场低开低走&#xff0c;沪指收盘失守2800点。截至收盘&#xff0c;上证综指跌2.68%&#xff0c;报2756.34点&#xff1b;深证成指跌3.5%&#xff0c;报8479.55点&#xff1b;创业板指跌2.83%&#xff0c;报1666.88点。沪深两市合计成交额7941亿元&#xf…

Django代码中的TypeError ‘float‘ object is not callable

学习使用Django进行网页爬取取决于你对Python、Django框架和网络爬虫的熟悉程度。以下是一些关键点&#xff0c;总的来说&#xff0c;如果你已经具备Python和Django的基础知识&#xff0c;并对网页爬虫有一定了解&#xff0c;那么学习使用Django进行网页爬取将会比较容易。如果…

鸿蒙应用开发学习:获取手机位置信息

一、前言 移动应用中经常需要获取设备的位置信息&#xff0c;因此在鸿蒙应用开发学习中&#xff0c;如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码&#xff0c;于是在百度上搜了一下&#xff0c;可能是我输入的关键字不对&#xff0c;结果没有找到想要…

Bluetooth Device Address(BD_ADDR) - 2

蓝牙核心规范&#xff1a;Core v5.3中关于蓝牙地址的其他说明 Vol 3: Host, Part C: Generic Access Profile 3 User interface aspects 3.2 Representation of Bluetooth parameters 3.2.1 Bluetooth Device Address (BD_ADDR) BD_ADDR 是蓝牙设备使用的地址。在设备发现过…

Docker容器操作 Docker创建并运行Nginx、Redis

容器操作的命令如图&#xff1a; 容器命令 # 创建并运行一个容器&#xff0c;运行成功后会返回容器id docker run# 暂停&#xff0c;将容器挂起&#xff0c;内存暂存&#xff0c;CPU不再执行 docker pause # 恢复运行&#xff0c;内存恢复&#xff0c;CPU恢复 docker unpause#…

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

微信小程序实现长按 识别图片二维码

第一种方案&#xff08;只需要在image里面加一个属性就可以了&#xff09; show-menu-by-longpress“{{true}}” <image show-menu-by-longpress"{{true}}" src"{{sysset.dyqewm}}" />第二种方案 放大预览图片&#xff0c;长按识别二维码 wxml <…

ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>=5.12

一、错误描述 ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>5.12 在用python中的plt包进行绘图时对plt进行了更新&#xff0c;更新之后再运行以前的代码就出现了这个问题。 二、bug消除 &#xff08;一&#xff09;解决方法——升级pyqt包…

【4k】4k的webrtc播放示例

目录 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数

关于在微信小程序中使用taro + react-hook后销毁函数无法执行的问题

问题&#xff1a; 在 taro中使用navigageTo() 跳转路由后hook中useEffect 的return函数没有执行 没有执行return函数 框架版本&#xff1a; tarojs: 3.6 react: 18.0 原因&#xff1a; 使用navigateTo() 跳转路由的话并不会销毁页面和组件&#xff0c;会加入一…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…