Spring Security学习

news2024/9/24 21:03:40

系列文章目录

第一章 基础知识、数据类型学习
第二章 万年历项目
第三章 代码逻辑训练习题
第四章 方法、数组学习
第五章 图书管理系统项目
第六章 面向对象编程:封装、继承、多态学习
第七章 封装继承多态习题
第八章 常用类、包装类、异常处理机制学习
第九章 集合学习
第十章 IO流、多线程学习
第十一章 仓库管理系统JavaSE项目
第十二章 员工管理系统、多表查询、反射实现DBHelper学习
第十三章 DML、DDL、数据库对象学习
第十四章 网络编程、各种标签、CSS学习
第十五章 ECMAScript、BOM学习
第十六章 DOM、jQuery学习
第十七章 servlet、jsp、Cookie、Ajax学习
第十八章 融资管理系统JavaWeb项目
第十九章 MyBatis框架学习
第二十章 逆向工程、Spring框架IOC、AOP学习
第二十一章 SpringMVC框架学习
第二十二章 SpringBoot框架学习
第二十三章 招聘网站框架项目
第二十四章 Vue介绍、窗体内操作、窗体间操作学习
第二十六章 Vue路由配置、网络请求访问框架项目、element组件介绍学习
第二十五章 标准管理系统Vue项目
第二十六章 Linux安装、Nginx反向代理、负载均衡学习
第二十七章 Docker学习
第二十八章 Jenkins学习
第二十九章 Nexus学习
第三十章 Spring Security学习


文章目录

  • 系列文章目录
  • 前言
  • 一、Spring Security介绍
    • 1. Spring Security介绍
    • 2. Spring Security特性
  • 二、Spring Security代码编写:第一阶段
    • 1. 创建Maven项目
    • 2. 在pom文件里添加依赖
    • 3. 目录结构
    • 4. SecurityController文件
    • 5. 配置SpringBootMain文件
    • 6. application.yml文件
    • 7. main.html文件
    • 8. 启动项目
  • 三、Spring Security代码编写:第二阶段
    • 1. 第二阶段第三阶段总体结构图
    • 2. SecurityConfig文件
    • 3. UserDetailsServiceImpl文件
    • 4. login.html文件
    • 5. 实现效果
  • 四、Spring Security代码编写:第三阶段
    • 1. RememberMeConfig文件
    • 2. SecurityConfig文件
    • 3. login.html更改
    • 4. 创建数据库和表
    • 5. 实现效果
  • 五、Spring Security代码编写:第四阶段
    • 1. 项目结构
    • 2. 新增show.html界面
    • 3. 更新UserDetailsServiceImpl文件返回值
    • 4. 实现效果
  • 六、CSRF
  • 总结


前言

本文我们要讲述:
Spring Security
在下攸攸太上,是有人类女友的外星来客。


一、Spring Security介绍

1. Spring Security介绍

Spring Security是一个功能强大且灵活的安全框架,用于在Spring应用程序中提供身份验证授权、保护和攻击防护等安全功能。它提供了大量的配置选项和扩展机制,使开发者能够轻松地集成和定制应用程序的安全需求。

2. Spring Security特性

身份验证(Authentication):Spring Security提供了多种身份验证机制,包括基于表单、HTTP基本认证、OpenID、LDAP、OAuth等。它还支持自定义身份验证逻辑,可以轻松地集成其他身份验证提供者。

授权(Authorization):Spring Security提供了强大的授权机制,可以根据用户的身份和角色来限制其对资源的访问。它支持基于角色和权限的访问控制,可以在代码和配置中定义细粒度的安全规则。

攻击防护(Attack Protection):Spring Security提供了多种防护机制,用于防范常见的安全威胁,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、点击劫持、会话管理等。它使用了各种技术和策略,如CSRF令牌、XSS过滤器、会话管理器等来保护应用程序的安全性。

安全事件和日志(Security Events and Logging):Spring Security提供了丰富的安全事件和日志功能,可以记录和跟踪与安全相关的事件。开发者可以基于这些事件和日志来监控和审计应用程序的安全性,并对可能的安全威胁做出响应。

扩展性和定制化(Extensibility and Customization):Spring Security提供了灵活的配置选项和扩展机制,使开发者能够根据应用程序的特定需求进行定制。开发者可以编写自定义的认证和授权逻辑,实现自定义的安全过滤器和拦截器,以满足应用程序的特定安全需求。

本文将着重介绍身份验证、授权的特性。

二、Spring Security代码编写:第一阶段

1. 创建Maven项目

在这里插入图片描述

2. 在pom文件里添加依赖

    <dependencies>
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            <version>3.0.4.RELEASE</version>
        </dependency>
        <!-- 4.添加mysql数据库的驱动包依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.30</version>
        </dependency>
        <!-- 3.添加Mybatis 的启动器依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <!-- SpringBoot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.10.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- SpringMVC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <!-- Thymeleaf -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <!--Spring Security-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>2.1.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

3. 目录结构

在这里插入图片描述

4. SecurityController文件

@Controller
public class SecurityController {
    @RequestMapping("/main")
    public String main(){
        return "main";
    }
}

5. 配置SpringBootMain文件

@SpringBootApplication
public class SpringBootMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class, args);
    }
}

6. application.yml文件

server:
  port: 8181

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password:
    url: jdbc:mysql://localhost:3308/security

7. main.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>main</title>
</head>
<body>
    <h1>我是Main页面!我要刺杀老师!喝啊!</h1>
    <a href="/logout">退出登录</a>
</body>
</html>

8. 启动项目

打开网页,输入:127.0.0.1:8080
做一次页面点击后,控制台输出密码
在这里插入图片描述
我们输入固定的用户名:user与密码:891de0f8-256c-4f74-ba5b-999f25531c82可进行登录,登录后在地址栏可以访问/main页面
在这里插入图片描述
在这里插入图片描述
没有登录前,会自动跳转到/login页面,因为没有做登录之前,程序不让进行其他操作(第二阶段可改)
我们其实登录都是使用自定义的用户名和密码,于是乎,我们如何自定义用户名、密码呢?且听下回分解

三、Spring Security代码编写:第二阶段

欸!我就是下回诶!

1. 第二阶段第三阶段总体结构图

在这里插入图片描述

2. SecurityConfig文件

package com.jjy.config;

import com.jjy.service.impl.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 表单认证
        http.formLogin()
                .loginProcessingUrl("/login")
                //此处表单不写action属性也可以  //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
                .successForwardUrl("/main")   //此处是post请求
                .loginPage("/login.html");

        // url 拦截
        http.authorizeRequests()
                .antMatchers("/login.html").permitAll() //login.html不需要被认证
                .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。

        //关闭csrf防护
        http.csrf().disable();
    }
    @Bean // 是Bean标签,security框架要求密码必须是加密的处理,
    public PasswordEncoder getPwdEncoder(){
        return new BCryptPasswordEncoder();
    }
}

3. UserDetailsServiceImpl文件

自定义用户名为admin,密码为123

package com.jjy.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
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.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 1. 查询数据库判断用户名是否存在,如果不存在抛出UsernameNotFoundException
        if (!username.equals("admin")){
            throw new UsernameNotFoundException("用户名不存在");
        }
        // 把查询出来的密码进行解析,或者直接把password放到构造方法中
        String password = passwordEncoder.encode("123");
        return new User(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));

    }
}

4. login.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

5. 实现效果

在这里插入图片描述

四、Spring Security代码编写:第三阶段

记忆功能实现

1. RememberMeConfig文件

package com.jjy.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;
import javax.sql.DataSource;
@Configuration
public class RememberMeConfig {
    @Autowired
    private DataSource dataSource;
    @Bean
    public PersistentTokenRepository getPersistentTokenRepository() {
        JdbcTokenRepositoryImpl jdbcTokenRepositoryImpl=new JdbcTokenRepositoryImpl();
        jdbcTokenRepositoryImpl.setDataSource(dataSource);
        //自动建表,第一次启动时需要,第二次启动时注释掉
        //jdbcTokenRepositoryImpl.setCreateTableOnStartup(true);  //该代码不好用,使用sql手动创建库,表
        return jdbcTokenRepositoryImpl;
    }
}

2. SecurityConfig文件

package com.jjy.config;

import com.jjy.service.impl.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Autowired
    PersistentTokenRepository repository;
    // private  RememberMeConfig repository;

    @Autowired
    private UserDetailsServiceImpl userDetailsService;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.rememberMe()
                .userDetailsService(userDetailsService) //登录逻辑交给哪个对象
                .tokenRepository(repository);   //持久层对象
        // 表单认证
        http.formLogin()
                .loginProcessingUrl("/login")
                //此处表单不写action属性也可以  //当发现/login时认为是登录,需要执行UserDetailsServiceImpl
                .successForwardUrl("/main")   //此处是post请求
                .loginPage("/login.html");

        // url 拦截
        http.authorizeRequests()
                .antMatchers("/login.html").permitAll() //login.html不需要被认证
                .anyRequest().authenticated();//所有的请求都必须被认证。必须登录后才能访问。

        //关闭csrf防护
        http.csrf().disable();
    }

    @Bean // 是Bean标签,security框架要求密码必须是加密的处理,
    public PasswordEncoder getPwdEncoder(){
        return new BCryptPasswordEncoder();
    }
}

3. login.html更改

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/login" method="post">
    用户名:<input type="text" name="username"><br/>
    密码:<input type="password" name="password"><br/>
    <input type="checkbox" name="remember-me" value="true"/>记住我 <br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

4. 创建数据库和表

创建security数据库
创建表的语句

create table persistent_logins (
username varchar(64) not null, 
series varchar(64) primary key, 
token varchar(64) not null, 
last_used timestamp not null)

5. 实现效果

输入如下属性,点击记住我(密码123),之后提交
在这里插入图片描述
可以自动跳转页面,同时数据库新增一条数据
在这里插入图片描述
点击退出登录后,数据库内数据被清除
在这里插入图片描述

五、Spring Security代码编写:第四阶段

本阶段主要做权限验证

1. 项目结构

在这里插入图片描述

2. 新增show.html界面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>获得springsequraty属性</h1>
用户名:<span sec:authentication="name">123</span><br/>
用户名:<span sec:authentication="principal.username">456</span><br/>
凭证:<span sec:authentication="credentials">456</span><br/>
权限和角色:<span sec:authentication="authorities">456</span><br/>
客户端地址:<span sec:authentication="details.remoteAddress">456</span><br/>
sessionId:<span sec:authentication="details.sessionId">456</span><br/>

通过权限判断:
<button sec:authorize="hasAuthority('/insert')">新增</button>
<button sec:authorize="hasAuthority('/delete')">删除</button>
<button sec:authorize="hasAuthority('/update')">修改</button>
<button sec:authorize="hasAuthority('/select')">查看</button>
<br/>
通过角色判断:
<button sec:authorize="hasRole('abc')">新增</button>
<button sec:authorize="hasRole('abc')">删除</button>
<button sec:authorize="hasRole('abc')">修改</button>
<button sec:authorize="hasRole('abc1')">查看</button>
</body>
</html>

3. 更新UserDetailsServiceImpl文件返回值

	return new User(username, password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,/select,/insert,ROLE_abc1"));

在这里插入图片描述
赋予admin用户select、insert的权限,归于ROLE_abc1组下

4. 实现效果

登录后,我们通过地址栏输入http://127.0.0.1:8181/show进入show页面,可以发现,用户admin的权限只有新增、查看两项。
在这里插入图片描述

六、CSRF

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击技术,攻击者通过伪造用户的请求来实现非法操作,利用用户在目标网站上的身份和权限。

CSRF攻击通常发生在存在用户身份验证的应用程序中。攻击者诱使受害者在已经登录过的网站上执行恶意操作,从而利用受害者的权限进行非法操作。攻击者可以通过各种手段,如发送伪造的电子邮件、社交工程攻击、恶意广告等来引诱受害者点击恶意链接或访问恶意网站。

Spring Security是一个功能强大的安全框架,提供了多种功能来保护应用程序免受常见的安全威胁,包括 CSRF攻击。在Spring Security中,默认情况下启用了CSRF防护。

CSRF防护是通过生成和验证一个CSRF令牌来实现的。这个令牌通常是一个随机生成的字符串,由服务器在用户访问页面时生成,并将其附加到表单或请求的头部中。在用户提交请求时,服务器会验证请求中的令牌是否与服务器生成的令牌匹配,如果不匹配,服务器将拒绝该请求,防止CSRF攻击的发生。

在Spring Security配置中,可以使用csrf()方法来配置和启用CSRF防护。默认情况下,Spring Security会生成一个CSRF令牌,并将其附加到表单和请求头中。如果需要关闭CSRF防护,可以使用http.csrf().disable()方法来禁用它。

总结起来,CSRF是一种常见的网络攻击技术,Spring Security提供了默认的CSRF防护来保护应用程序免受此类攻击。


总结

本文讲述了:
Spring Security:进行身份验证、授权功能的框架
在下攸攸太上,如果把我的生活拍成电视剧,那将会是《来自行星的高级生命体》。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吸烟行为检测、重点区域吸烟检测、吸烟检测算法样本标注

吸烟检测算法主要用于公共场所、工作场所和家庭环境中的吸烟行为监控&#xff0c;通过图像识别技术来检测和识别吸烟行为&#xff0c;以确保环境卫生和公共安全。这种技术可以帮助管理者实时监控吸烟行为&#xff0c;及时采取措施&#xff0c;减少二手烟的危害。 一、技术实现…

短视频矩阵源码/短视频矩阵系统搭建/源码开发知识分享

集星云推智剪获客系统&#xff0c;通过自主研发的高效发布模式&#xff0c;为企业提供稳定的接口与自动化操作&#xff0c;助力企业实现短视频矩阵的构建。该系统整合了十大核心功能&#xff0c;包括AI辅助文案撰写、视频剪辑、智能去重、内容拆分、文字转语音、文本提取、批量…

2024源代码加密软件TOP10分享|企业源代码加密软件

在现代企业的数字化转型过程中&#xff0c;源代码作为企业核心知识产权之一&#xff0c;至关重要。为了防止数据泄漏、外部攻击以及内部违规操作&#xff0c;企业越来越关注源代码的加密和保护。本文将为大家介绍2024年最受欢迎的十大源代码加密软件&#xff0c;帮助企业更好地…

【信息论基础第三讲】再谈离散信源的信息测度之熵的性质多符号信源的信息测度

一、Piece Of Cake 1、离散信源X的熵是H(X)是一个常数而不是一个变量 解释&#xff1a;离散信源的熵也就是自信息I(X)的数学期望&#xff0c;即H(X) E[I(Xi)]&#xff0c;而通过概率论的知识我们知道数学期望是一个常数&#xff0c;故熵也是一个常数。 2、八元编码系统&…

音频3A——初步了解音频3A

文章目录 前言一、3A使用的场景和原理1.AEC2.AGC3.ANS/ANR4.硬件3A和软件3A的区别1&#xff09;层级不同2&#xff09;处理顺序不同3&#xff09;优缺点 5.处理过程 二、3A带来的问题三、开源3A算法总结 前言 在日常的音视频通话过程中&#xff0c;说话的双端往往会面对比较复…

【后端开发】JavaEE初阶—线程安全问题与加锁原理(超详解)

前言&#xff1a; &#x1f308;上期博客&#xff1a;【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作&#xff08;超详解&#xff09;-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f308;小编会在后端开发的学习中不…

综合体第三题(DHCP报文分析)

DHCP&#xff08;一般情况下&#xff09; 某公司网络DHCP服务器地址为192.168.0.2&#xff0c;可分配IP地址为192.168.0.6-192.168.0.254&#xff0c;缺省网关的地址为192.168.0.1&#xff0c;DNS服务器地址为192.168.0.2。网络中某客户机从服务器获取IP地址后&#xff0c;在客…

初识爬虫8

1.selenium的作用和工作原理 2. 使用selenium&#xff0c;完成web浏览器调用 # -*- coding: utf-8 -*- # 自动化测试工具&#xff0c;降低难度&#xff0c;性能也降低 from selenium import webdriverdriver webdriver.Edge()driver.get("https://www.itcast.cn/")…

Python语言基础教程(上)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

新规2027年生效 美国禁止中国智能网联汽车软硬件

当地时间9月23日&#xff0c;美国商务部工业和安全局&#xff08;BIS&#xff09;发布了一项拟议规则制定通知&#xff08;NPRM&#xff09;&#xff0c;该通知将禁止销售或进口集成特定硬件和软件的联网车辆&#xff0c;或单独销售这些组件&#xff0c;这些硬件和软件与中国或…

增强网络威胁防御能力的云安全新兴技术

一些行业专家强调了基于云的运营的独特网络安全需求&#xff0c;并指出保护敏感数据与传统的本地网络不同。尽管新兴技术并没有改变网络安全专业人员与犯罪分子之间持续的斗争&#xff0c;但它们提高了赌注&#xff0c;使斗争变得更加复杂。 如今&#xff0c;我们面对的是技术…

CSS | 如何来避免 FOUC(无样式内容闪烁)现象的发生?

一、什么是 FOUC(无样式内容闪烁)? ‌FOUC&#xff08;Flash of Unstyled Content&#xff09;是指网页在加载过程中&#xff0c;由于CSS样式加载延迟或加载顺序不当&#xff0c;导致页面出现闪烁或呈现出未样式化的内容的现象。‌ 这种现象通常发生在HTML文档已经加载&…

为什么数据需要 QA 流程

当有人问我做什么工作时&#xff0c;我会说我是一名数据质量保证 (QA) 工程师。他们并不真正理解我的意思。“嗯&#xff0c;我做数据测试&#xff0c;”我试图解释&#xff0c;但常常无济于事。我有一些从事技术和软件开发的朋友&#xff0c;他们不太了解数据测试是什么&#…

[LLM 学习笔记] Transformer 基础

Transformer 基础 Transformer 模型架构 主要组成: Encoder, Decoder, Generator. Encoder (编码器) 由 N N N 层结构相同(参数不同)的 EncoderLayer 网络组成. In : [ b a t c h _ s z , s e q _ l e n , d m o d e l ] \textbf{In}: [batch\_sz, seq\_len, d_{model}] I…

【WorldView系列卫星】

WorldView系列卫星 WorldView系列卫星是美国DigitalGlobe公司推出的一系列先进商业遥感卫星&#xff0c;旨在提供高分辨率的地球成像服务。该系列卫星以其卓越的成像能力&#xff0c;如高分辨率、快速重访时间和宽幅扫描能力&#xff0c;引领了地球观测技术的新标准。以下是对…

LCD1602

LCD1602 是一种工业字符型液晶显示屏&#xff0c;能够同时显示 16x2 即 32 个字符。 LCD的显示控制 通过向 LCD1602 发送指令和数据来控制其显示内容。指令包括清屏、设置光标位置、显示模式等&#xff1b;数据则是要显示的字符的 ASCII 码。LCD1602 内部有一个控制器&#x…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

ChatGLM-6B:部署指南与实战应用全解析

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 SD3ComfyUI文生图部署步骤DAMODEL-ChatGLM-6B 服务端部署1.1、实例创建1.2、模型准备1.3、模型启动 SD3ComfyUI文生图部署步骤 Chat…

centos系统配置本地镜像源

今天在安装docker相关的依赖包时&#xff0c;在centos系统上&#xff0c;发现很多原本的镜像地址&#xff0c;拉取rpm依赖包失败&#xff0c;因为我的centos系统&#xff0c;安装的时候使用的是最小化安装&#xff0c;很多rpm包没有安装好&#xff0c;所以在后续安装一些常规命…

电脑共享同屏的几种方法分享

实时共享屏幕的方法多种多样&#xff0c;适用于不同的设备和场景。以下是几种常见的实时共享屏幕的方法&#xff1a; 1. 使用无线投屏技术 原理&#xff1a;无线投屏技术允许设备通过Wi-Fi网络或其他无线连接方式&#xff0c;将屏幕内容实时投射到另一台设备上。 操作步骤&a…