【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 = "略";
    
        @Autowired
        private OpenApiExtensionResolver openApiExtensionResolver;
    
        public Knife4jConfiguration() {
            System.out.println("【配置类】Knife4jConfiguration-----已运行");
        }
    
        @Bean
        public 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 {
    
        @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);
        }
    
        @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);
        }
    
    }
    
  • 方法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 {
    
        @Test
        public 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 {
    
        @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;
        }
    
    }
    
  • (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 {
    
        @Bean
        public 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】

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RFID标签是什么?该技术有哪些应用领域?

射频识别&#xff08;RFID&#xff09;技术利用电磁场&#xff0c;自动识别和跟踪附在物体上的标签&#xff0c;其中&#xff0c;近场通信&#xff08;NFC&#xff09;是一种基于短距离RFID高频技术的标准&#xff0c;支持13.56 MHz的频率。 NFC技术在现今的产品中应用广泛&am…

一文掌握全方位构建 ECS 安全体系的最佳方法

云布道师 2024 开年伊始&#xff0c;阿里云弹性计算团队全新推出新一季【ECS 安全季】&#xff0c;通过分享云上安全体系相关产品与最佳实践&#xff0c;让用户快速上手构建业务的安全防护能力。 首节课程《如何全方位构建 ECS 的安全体系》由阿里云弹性计算高级产品专家马小…

Python一些可能用的到的函数系列122 ATimer2

说明 由于时间处理在算网中起到了更重要的作用&#xff1a;不仅是进行时间计算&#xff0c;而是成为架构规范的一部分&#xff0c;因此需要对ATimer进行升级&#xff0c;成为一个基础依赖对象。 内容 1 设计 ATimer的作用更多的是进行即时计算&#xff0c;ATimer2将拓展为基…

关于软件0X00000007B的问题

对于0x0000007B问题相信大家一定都很头疼,编译好的软件在自己电脑上可以正常运行,更换一台电脑或许就无法正常运行.那么我们改怎么处理呢? 情况一:vs版本不一致导致的打不开软件 1方法一Windows日志查看软件运行失败的原因,一般都是dll版本不兼容引起的无法调用,解决方法 “”…

穿越网络边界:深入了解 FRP 内网穿透机制

前言 在当今互联网时代&#xff0c;内网穿透成为了解决内部网络服务对外难以访问的问题的一种重要方式。Fast Reverse Proxy&#xff08;FRP&#xff09;作为一款强大的反向代理工具&#xff0c;为用户提供了一种高效、灵活的内网穿透解决方案。本文将深入介绍 FRP 的原理和使…

java基础学习: 什么是泛型的类型擦除

文章目录 一、什么是泛型2、泛型编译前和编译后对比3、泛型的优点&#xff08;1&#xff09;提高了代码的复用性和可读性&#xff08;2&#xff09;提高了代码的安全性 二、泛型的定义1、泛型类2、泛型接口3、泛型方法 三、泛型通配符1、&#xff1f;和T有什么区别2、通配符的分…

喝汽水问题(c语言)

喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff0c;这里用c语言来解释 可以先用列举法来说明&#xff0c;20可以买20个汽水&#xff0c;两个空瓶换一瓶就可以获得10个汽水&#xff0c;同理10个空瓶个可…

IDEA常用插件(本人常用,不全)

文章目录 一、图标提示类插件1、Lombok插件&#xff08;用户配合lombok依赖的工具&#xff09;2、MybatisX插件3、GitToolBox4、VUE.js5、ESLint 二、代码自动生成插件1、EasyCode插件&#xff1a;自动生成代码神器2、GsonFormat 三、常用工具类1、IDE Eval Reset 插件&#xf…

vector函数介绍与实现(迭代器失效)

目录 一、介绍vector 1.vector是什么 2.vector的特点 1.随机访问 2.缓存命中 3.vector的结构 二、vector的函数 1.构造函数&#xff08;创建&#xff09;​编辑 2.Iterator&#xff08;迭代器&#xff09; 3.Capacity&#xff08;容量&#xff09; 三、迭代器失效 …

数据库性能优化的解决方案

目录​​​​​​​ 1、什么是数据库性能优化 1.1 数据库性能优化的概念 1.2 为何需要进行数据库性能优化 1.3 数据库性能优化的好处 2、数据库性能优化的基本原理 2.1 数据库查询优化 2.2 数据库索引优化 2.3 数据库表结构优化 2.4 数据库硬件优化 3、数据库查询优化…

一个好用的服务器控制面板

简介 它是一个免费开源的管理面板工具&#xff0c;可以帮助你集中管理多个服务器和网站。Ajenti 支持 Linux、BSD、Mac OS X和Windows 等多个操作系统&#xff0c;并且可以通过一个直观的 Web 界面来完成各种系统管理任务。 相比于其他管理面板&#xff0c;Ajenti有以下几个优…

go语言数组和切片

1. 数组Array Golang Array和以往认知的数组有很大不同。 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

数字主持人有多少种应用方式?

在数字经济时代下&#xff0c;越来越多企业、品牌以数字人进行新闻资讯报道、主持互动、人机交互等多形式&#xff0c;提升企业、品牌的影响力和认知度。 *图片源于网络 如山东广播电视台数字主持人“海蓝”&#xff0c;不仅可以用大会活动现场&#xff0c;用多国语言与主持人、…

从零开始c++精讲:第四篇——模板初阶

文章目录 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板原理2.4函数模板实例化2.5函数模板匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& righ…

ios适配虚拟home键

在H5开发过程中遇到一个兼容性问题。iphone手机的虚拟home键会对屏幕底部的内容造成遮挡。要处理此问题&#xff0c;需要清楚安全区域这个概念。 安全区域 根据刘海和虚拟Home键&#xff0c;Apple为其设备提供了屏幕安全区域的视觉规范 竖屏&#xff1a;竖屏的时候&#xff…

基于springboot在线学习平台源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台采用ja…

PWN入门Protostar靶场Stack系列

Protostar靶场地址 https://exploit.education/protostar/溢出 源码分析 #include <stdlib.h> #include <unistd.h> #include <stdio.h>int main(int argc, char **argv) {volatile int modified; //定义一个变量char buffer[64]; //给…

C++:优先队列-Priority_queue

目录 1.关于优先队列 2.priority_queue的使用 1.构造方法 2.empty();判空 3.size(); 4.top(); 5.push(val); 6.pop(); 3.优先队列模拟实现 4.用优先队列解决数组中第K个大的元素 1.关于优先队列 在C中&#xff0c;可以使用STL&#xff08;标准模板库&#xff09;中的p…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的…

SpringBoot使用Swagger2生成接口文档

一、导入依赖 <!-- knife4j--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.7</version></dependency> 二、配置类 通过一下配置&am…