博客星球大冒险:用Spring Boot和JWT打造你的数字王国

揭秘如何在Spring Boot中无缝集成JWT,为你的应用打造一个高度可扩展且安全的认证系统。从添加依赖到创建JWT过滤器,再到实现令牌的有效性管理和刷新机制,每一步都精心设计,确保你的乐园能够迎接成千上万的游客!

文章目录

    • 构建一个基于Spring Boot的个人博客系统
      • 第一部分:搭建基础框架
      • 第二部分:文章的CRUD操作与JWT令牌验证
        • 创建文章
        • 读取文章
        • 更新文章
        • 删除文章
        • JWT令牌验证
      • 第三部分:增强安全性与JWT令牌刷新
        • 使用HTTPS
        • CORS策略配置
        • JWT令牌刷新机制
      • 第四部分:监控与维护,确保系统稳定运行
        • 系统监控
        • 数据备份
        • 用户反馈
        • 性能优化
        • 安全审计
        • 持续集成/持续部署(CI/CD)
      • 实战案例总结与未来展望
        • 实战案例总结
        • 未来展望

在这里插入图片描述

构建一个基于Spring Boot的个人博客系统

第一部分:搭建基础框架

在这个信息爆炸的时代,每个人都有自己的故事想要分享。想象一下,你是一个充满激情的博主,想要搭建一个属于自己的个人博客系统,让世界听到你的声音。而今天,我们就要用Spring Boot和JWT来实现这个梦想。

首先,我们需要搭建一个基础的Spring Boot项目。这就像是准备一块空白的画布,等待我们在上面挥洒创意。

  1. 创建项目:打开你最爱的IDE(比如IntelliJ IDEA或者Eclipse),创建一个新的Spring Boot项目。选择你需要的依赖,比如Spring WebSpring SecurityJWT

  2. 配置文件:在src/main/resources目录下,创建你的application.properties文件,配置数据库连接、服务器端口等信息。

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/your_blog_db
    spring.datasource.username=root
    spring.datasource.password=yourpassword
    jwt.secret=your_jwt_secret_key
    
  3. 数据库设计:设计一个简单的数据库,至少包含用户表和博客文章表。用户表存储用户的基本信息,博客文章表存储文章内容。

  4. 实体类:创建对应的实体类(Entity),比如UserPost

    @Entity
    public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;// getters and setters
    }@Entity
    public class Post {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String content;@ManyToOneprivate User author;// getters and setters
    }
    
  5. 仓库接口:创建Spring Data JPA的仓库接口,用于数据访问。

    public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);
    }public interface PostRepository extends JpaRepository<Post, Long> {List<Post> findByAuthorId(Long authorId);
    }
    
  6. 安全配置:配置Spring Security,启用JWT认证。

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {// 省略部分代码...@Overrideprotected void configure(HttpSecurity http) throws Exception {http// 配置省略....csrf().disable(); // 禁用CSRF,因为JWT是无状态的}
    }
    
  7. 用户服务:创建用户服务,用于处理用户注册、登录等业务逻辑。

    @Service
    public class UserService {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PasswordEncoder passwordEncoder;public User registerUser(User user) {user.setPassword(passwordEncoder.encode(user.getPassword()));return userRepository.save(user);}public String login(String username, String password) {User user = userRepository.findByUsername(username).orElseThrow(() -> new RuntimeException("User not found"));if (passwordEncoder.matches(password, user.getPassword())) {return Jwts.builder().setSubject(user.getUsername()).signWith(SignatureAlgorithm.HS256, "your_jwt_secret_key".getBytes()).compact();}throw new RuntimeException("Invalid username or password");}
    }
    
  8. 控制器:创建控制器,提供API接口。

    @RestController
    @RequestMapping("/api")
    public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<?> register(@RequestBody User user) {User registeredUser = userService.registerUser(user);return ResponseEntity.ok(registeredUser);}@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {String token = userService.login(loginRequest.getUsername(), loginRequest.getPassword());return ResponseEntity.ok(new AuthenticationResponse(token));}
    }
    

现在,我们已经搭建了一个基本的个人博客系统的框架。在下一部分,我们将实现文章的创建、查询、更新和删除功能,同时加入JWT令牌的验证,确保只有登录用户才能操作自己的文章。敬请期待,我们的个人博客系统即将变得更加完善和安全!

第二部分:文章的CRUD操作与JWT令牌验证

随着我们的个人博客系统的基础框架搭建完成,现在我们要进入更加激动人心的部分——实现文章的CRUD(创建、读取、更新、删除)操作,并确保通过JWT令牌验证来保护这些操作的安全。

创建文章

首先,我们需要允许用户创建文章。这就像是在乐园中添加新的游乐设施,让游客们有更多新鲜事物可以体验。

  1. 文章控制器:在控制器中添加创建文章的接口。

    @RestController
    @RequestMapping("/api/posts")
    public class PostController {@Autowiredprivate PostService postService;@PostMapping("/")public ResponseEntity<?> createPost(@RequestBody Post post, @AuthenticationPrincipal User currentUser) {if (post.getAuthor().getId().equals(currentUser.getId())) {Post createdPost = postService.createPost(post);return ResponseEntity.ok(createdPost);}return ResponseEntity.status(HttpStatus.FORBIDDEN).build();}
    }
    
  2. 文章服务:在服务层实现创建文章的逻辑。

    @Service
    public class PostService {@Autowiredprivate PostRepository postRepository;public Post createPost(Post post) {return postRepository.save(post);}// 其他服务方法...
    }
    
读取文章

接下来,我们需要允许用户读取文章。这就像是在乐园中设置指示牌,让游客们知道每个游乐设施的位置和介绍。

  1. 读取单篇文章:允许用户通过文章ID来读取单篇文章。

    @GetMapping("/{id}")
    public ResponseEntity<?> getPostById(@PathVariable Long id) {Optional<Post> post = postRepository.findById(id);if (post.isPresent()) {return ResponseEntity.ok(post.get());}return ResponseEntity.notFound().build();
    }
    
  2. 读取用户所有文章:允许用户读取自己所有的文章。

    @GetMapping("/user/{userId}")
    public ResponseEntity<?> getPostsByUser(@PathVariable Long userId, @AuthenticationPrincipal User currentUser) {if (currentUser.getId().equals(userId)) {List<Post> posts = postService.getPostsByUser(userId);return ResponseEntity.ok(posts);}return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
    }
    
更新文章

更新文章就像是给游乐设施进行维护和升级,确保它们始终保持最佳状态。

  1. 更新文章接口:在控制器中添加更新文章的接口。

    @PutMapping("/{id}")
    public ResponseEntity<?> updatePost(@PathVariable Long id, @RequestBody Post postDetails, @AuthenticationPrincipal User currentUser) {Optional<Post> post = postRepository.findById(id);if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {post.get().setTitle(postDetails.getTitle());post.get().setContent(postDetails.getContent());Post updatedPost = postRepository.save(post.get());return ResponseEntity.ok(updatedPost);}return ResponseEntity.notFound().build();
    }
    
删除文章

最后,我们需要允许用户删除文章。这就像是在乐园中拆除老旧的设施,为新的创意腾出空间。

  1. 删除文章接口:在控制器中添加删除文章的接口。

    @DeleteMapping("/{id}")
    public ResponseEntity<?> deletePost(@PathVariable Long id, @AuthenticationPrincipal User currentUser) {Optional<Post> post = postRepository.findById(id);if (post.isPresent() && post.get().getAuthor().getId().equals(currentUser.getId())) {postRepository.delete(post.get());return ResponseEntity.ok().build();}return ResponseEntity.notFound().build();
    }
    
JWT令牌验证

为了确保用户只能操作自己的文章,我们在每个需要认证的请求处理方法中,通过@AuthenticationPrincipal注解注入了当前认证的用户信息。然后,我们检查当前用户是否是文章的所有者。

通过这种方式,我们不仅实现了文章的CRUD操作,还确保了操作的安全性,防止了未授权的访问。

在本实战案例的下一部分,我们将深入探讨如何进一步增强我们的博客系统的安全性,包括使用HTTPS、配置CORS策略以及实现JWT的刷新机制等。敬请期待,让我们的博客系统更加坚不可摧!
在这里插入图片描述

第三部分:增强安全性与JWT令牌刷新

随着我们个人博客系统的CRUD功能实现,现在是时候加强系统的安全性,确保我们的数据和用户信息安全无虞。在这部分,我们将通过几个关键步骤来提升我们系统的安全等级。

使用HTTPS

首先,我们需要确保所有的数据传输都是加密的。这就像是给我们的乐园加上了一层隐形的防护罩,保护游客的安全。

  1. 获取SSL证书:你可以从证书颁发机构(CA)获取免费的SSL证书,或者如果你的服务器支持,也可以自签名一个证书。

  2. 配置HTTPS:在Spring Boot应用中配置HTTPS,通常涉及到配置server.ssl.key-store和相关的密钥密码。

    server.port=8443
    server.ssl.key-store=classpath:your.keystore
    server.ssl.key-store-password=your_keystore_password
    server.ssl.keyStoreType=PKCS12
    server.ssl.keyAlias=your_keyalias
    
  3. 强制重定向:在应用中强制所有HTTP请求重定向到HTTPS。

    @Configuration
    public class HttpsRedirectConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {return http.requiresChannel().anyRequest().requiresSecure().and().build();}
    }
    
CORS策略配置

跨源资源共享(CORS)是一个重要的安全机制,可以防止恶意网站访问我们的资源。我们需要合理配置CORS策略。

  1. CORS配置:在Spring Security配置中添加CORS策略。

    @Override
    protected void configure(HttpSecurity http) throws Exception {http.cors().configurationSource(request -> {CorsConfiguration config = new CorsConfiguration();config.setAllowedOrigins(Collections.singletonList("https://your-client-domain.com"));config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));return config;}).and()// 其他配置...
    }
    
JWT令牌刷新机制

JWT令牌通常有一个过期时间,所以我们需要一个机制来刷新令牌,而不是让用户重新登录。

  1. 刷新令牌(Refresh Token):当用户登录时,除了访问令牌外,我们还发放一个具有更长有效期的刷新令牌。

    public class AuthenticationResponse {private String accessToken;private String refreshToken;// 构造函数、getter和setter
    }
    
  2. 刷新令牌存储:刷新令牌需要被安全地存储在服务端,通常可以使用Redis等内存数据库。

  3. 刷新接口:创建一个接口,允许用户使用刷新令牌来获取新的访问令牌。

    @PostMapping("/refresh")
    public ResponseEntity<?> refreshAuthenticationToken(@RequestBody RefreshTokenRequest request) {String refreshToken = request.getRefreshToken();// 验证刷新令牌的有效性,如果有效,生成新的访问令牌// ...
    }
    
  4. 自动刷新令牌:在客户端,我们可以编写逻辑来自动检测令牌过期,并使用刷新令牌来获取新的访问令牌。

    // 假设我们有一个函数来检查令牌是否过期
    function isTokenExpired(token) {// 实现检查逻辑
    }// 刷新令牌的函数
    async function refreshToken() {const response = await fetch('/api/refresh', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({ refreshToken: localStorage.refreshToken })});const data = await response.json();localStorage.setItem('accessToken', data.accessToken);// 更新访问令牌并重试请求
    }// 在发送请求前检查令牌
    if (isTokenExpired(localStorage.accessToken)) {refreshToken().catch(error => console.error('Refresh token failed', error));
    }
    

通过这些步骤,我们不仅增强了个人博客系统的安全性,还提升了用户体验,让用户能够无缝地继续他们的活动,即使在令牌过期后也能平滑过渡。

接下来,我们将探讨如何监控和维护我们的系统,确保它始终运行在最佳状态。敬请期待,让我们的个人博客系统成为乐园中最闪亮的星!

第四部分:监控与维护,确保系统稳定运行

随着我们的个人博客系统功能日益完善,安全性得到加强,现在是时候关注系统的监控与维护了。这就像是乐园的日常运营,需要确保一切运转顺畅,给游客提供最好的体验。

系统监控

监控是确保系统稳定运行的关键。我们需要监控服务器性能、应用状态以及用户活动。

  1. 服务器监控:使用工具如Nagios、Zabbix或云服务提供商的监控工具来监控CPU、内存、磁盘和网络状态。

  2. 应用性能监控(APM):利用New Relic、Datadog或Spring Boot Actuator等工具来监控应用性能,包括响应时间、错误率等。

  3. 日志管理:配置日志管理系统,如ELK Stack(Elasticsearch, Logstash, Kibana)或Graylog,来收集、搜索和分析日志。

    logging.file.name=logs/myblog.log
    logging.level.root=WARN
    logging.level.com.example.myblog=DEBUG
    
  4. 健康检查:实现健康检查端点,用于实时监控应用状态。

    @GetMapping("/actuator/health")
    public Map<String, Object> healthCheck() {// 实现健康检查逻辑
    }
    
数据备份

数据是任何系统最宝贵的资产,因此定期备份至关重要。

  1. 定期备份:设置定期备份计划,备份数据库和重要文件。

  2. 灾难恢复计划:制定灾难恢复计划,确保在发生严重故障时能够快速恢复服务。

用户反馈

用户的反馈是改进系统的重要途径。

  1. 收集用户反馈:提供一个渠道,让用户可以报告问题或提出改进建议。

  2. 用户行为分析:分析用户行为数据,了解用户如何使用你的应用,并发现潜在的改进点。

性能优化

随着用户量的增加,性能优化变得尤为重要。

  1. 代码优化:定期审查和优化代码,减少不必要的计算和资源消耗。

  2. 数据库优化:优化数据库查询,使用索引,定期清理和维护数据库。

  3. 缓存策略:使用缓存来减少数据库访问次数,提高响应速度。

    @Cacheable("posts")
    public Post getPostById(Long id) {// 数据库查询逻辑
    }
    
安全审计

定期进行安全审计,确保没有安全漏洞。

  1. 代码审计:定期进行代码审计,查找潜在的安全漏洞。

  2. 依赖审计:使用工具如OWASP Dependency-Check来检查项目依赖中的已知漏洞。

  3. 安全测试:定期进行渗透测试和安全扫描,确保系统安全。

持续集成/持续部署(CI/CD)

自动化的CI/CD流程可以确保代码质量,并快速部署新功能和修复。

  1. 自动化测试:编写单元测试和集成测试,确保代码更改不会引入新的错误。

  2. 构建自动化:使用Jenkins、GitLab CI或GitHub Actions等工具自动化构建过程。

  3. 自动化部署:自动化部署流程,确保新版本可以平滑上线。

通过这些监控与维护措施,我们的个人博客系统将能够稳定运行,为用户提供持续的服务。这不仅能够提升用户满意度,还能确保我们能够及时发现并解决问题,保持系统的长期健康。

随着本实战案例的结束,我们希望读者能够从中获得宝贵的知识和经验,构建出自己的安全、稳定、高效的个人博客系统。记住,技术之路永无止境,持续学习、实践和改进,你的乐园将越来越精彩!
在这里插入图片描述

实战案例总结与未来展望

在本系列的实战案例中,我们从零开始,一步步构建了一个基于Spring Boot和JWT的个人博客系统。我们不仅实现了基本的CRUD功能,还加强了系统的安全性,实现了用户认证和授权,并通过HTTPS、CORS策略和JWT刷新机制来保护用户数据。此外,我们还探讨了如何对系统进行监控和维护,以及如何通过社区建设和开源协作来促进项目的持续发展。

实战案例总结
  1. 基础框架搭建:我们创建了用户和文章的实体类,配置了数据库,并实现了基本的Spring Security认证流程。

  2. CRUD功能实现:我们为博客文章提供了完整的创建、读取、更新和删除功能,并通过@AuthenticationPrincipal注解确保了操作的安全性。

  3. 安全性加强:通过实现HTTPS、CORS策略和JWT刷新机制,我们加强了系统的安全性,保护了用户数据和隐私。

  4. 监控与维护:我们讨论了如何对系统进行监控,包括服务器性能、应用状态和用户活动,并强调了数据备份和灾难恢复计划的重要性。

  5. 社区贡献与持续发展:我们探讨了如何通过社区建设、开源协作、持续学习、用户支持和国际化来促进项目的持续发展和创新。

未来展望

随着技术的不断进步和用户需求的不断变化,我们的个人博客系统也需要不断地演进和改进。以下是一些可能的未来发展方向:

  1. 人工智能集成:利用机器学习算法来分析用户行为,提供个性化的内容推荐。

  2. 移动应用开发:开发移动应用版本,让用户能够随时随地撰写和阅读博客。

  3. 社交功能增强:增加社交互动功能,如评论、点赞和分享,以提高用户参与度。

  4. 多云和微服务架构:随着用户量的增长,考虑采用多云策略和微服务架构来提高系统的可扩展性和可用性。

  5. 区块链技术应用:探索区块链技术在内容版权保护和用户身份验证方面的应用。

  6. 增强现实(AR)和虚拟现实(VR):利用AR和VR技术为用户提供沉浸式的内容体验。

  7. 国际化和本地化:进一步扩展多语言支持,为全球用户提供本地化的用户体验。

  8. 环境友好和可持续性:优化系统架构,减少能源消耗,致力于构建环境友好的绿色应用。

通过这些未来展望,我们可以看到个人博客系统的潜力和可能性是无限的。随着技术的不断发展,我们有理由相信,我们的系统将变得更加智能、互动和全球化。

在此,我们的实战案例告一段落。希望大伙们能够从本系列中获得启发,不仅在技术上有所提升,更在思维和视野上得到拓展。记住,每一次代码的编写,都是我们构建未来世界的一小步。让我们携手前进,共同创造一个更加美好的数字世界。

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

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

相关文章

LLM主流开源代表模型

LLM主流开源大模型介绍 1 LLM主流大模型类别 随着ChatGPT迅速火爆&#xff0c;引发了大模型的时代变革&#xff0c;国内外各大公司也快速跟进生成式AI市场&#xff0c;近百款大模型发布及应用。 目前&#xff0c;市面上已经开源了各种类型的大语言模型&#xff0c;本章节我们…

【MATLAB源码-第220期】基于matlab的Massive-MIMO误码率随着接收天线变化仿真采用ZF均衡和QPSK调制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 系统背景与目标 无线通信系统的发展极大地推动了现代通信技术的进步&#xff0c;从移动通信到无线局域网&#xff0c;甚至是物联网&#xff0c;均依赖于无线通信系统的高效和可靠性。在无线通信系统中&#xff0c;核心目…

【kafka】关于Kafka的入门介绍

为什么要使用kafka&#xff1f;kafka是什么东西&#xff1f; 案例场景 A服务向B服务发送消息&#xff0c;A服务传输数据很快&#xff0c;B服务处理数据很慢&#xff0c;这样B服务就会承受不住&#xff0c;怎么办&#xff1f;通过添加消息队列作为缓冲。kafka就是消息队列中的…

初识C++ · 模拟实现stack和Queue

目录 前言&#xff1a; 1 Stack 1.1 双端队列 2 Queue 前言&#xff1a; 经历了list三个自定义类型的洗礼&#xff0c;来个简单的放松放松&#xff0c;即栈和队列&#xff1a; 文档记录的&#xff0c;栈和队列是一种容器适配器&#xff0c;它们不属于stl&#xff0c;但是它…

低空经济发展报告

低空经济是指利用低空空间进行商业开发和经济活动的概念。随着航空技术的发展和无人机的普及&#xff0c;低空经济逐渐成为一个新兴的经济领域。 低空经济可以涵盖的领域非常广泛&#xff0c;包括但不限于物流配送、农业植保、城市交通、旅游观光等。利用无人机等飞行器进行物…

【算法】一文搞懂归并排序

概念 归并排序利用了分治思想&#xff0c;将待排序的数组范围层层划分&#xff0c;每次划分会得到两个大小相近的区间。当无法划分时&#xff0c;递归结束&#xff0c;自下而上进行区间合并merge操作&#xff0c;合并操作依次比较两个区间的元素&#xff0c;进而使合并后的区间…

【西瓜书】5.神经网络

1.概念 有监督学习正向传播&#xff1a;输入样本---输入层---各隐层---输出层反向传播&#xff1a;误差以某种形式在通过隐层向输入层逐层反转&#xff0c;并将误差分摊给各层的所有单元&#xff0c;以用于修正各层的权值激活函数&#xff1a;也叫阶跃函数&#xff0c;目的是引…

Maven 中的 classifier 属性用过没?

最近训练营有小伙伴问到松哥一个关于 Maven 依赖的问题&#xff0c;涉及到 classifier 属性&#xff0c;随机问了几个小伙伴&#xff0c;都说工作中没用到过&#xff0c;因此简单整篇文章和小伙伴们分享下。 Maven 大家日常开发应该都有使用&#xff0c;Maven 中有一个比较好玩…

最小二乘法算法(个人总结版)

最小二乘法&#xff08;Least Squares Method&#xff09;是一种通过最小化误差平方和来拟合数据的回归分析方法。它被广泛应用于线性回归、多元回归以及其他数据拟合问题中。以下是详细的教程&#xff0c;涵盖基本概念、数学推导、具体步骤和实现代码。 1. 最小二乘法基本概念…

装机必备——鲁大师安装教程

装机必备——鲁大师安装教程 软件下载 软件名称&#xff1a;鲁大师 软件语言&#xff1a;简体中文 软件大小&#xff1a;144.75M系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通道①迅雷云盘丨…

p5开发helloworld

注意&#xff0c;执行的时候&#xff0c;后面不用带class的后缀

C语言(字符、字符串函数)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

Pinia(三): 了解和使用state

1.state state 就是我们要定义的数据, 如果定义 store 时传入的第二个参数是对象, 那么 state 需要是一个函数, 这个函数的返回值才是状态的初始值.这样设计的原因是为了让 Pinia 在客户端和服务端都可以工作 官方推荐使用箭头函数(()>{ })获得更好的类型推断 import { de…

最新张量补全论文收集【8篇】

目录 1、利用张量子空间先验&#xff1a;增强张量补全的核范数最小化和 2、基于可学习空间光谱变换的张量核范数多维视觉数据恢复 3、用于图像补全的增强型低秩和稀疏 Tucker 分解 4、多模态核心张量分解及其在低秩张量补全中的应用 5、 低秩张量环的噪声张量补全 6、 视…

三十四、openlayers官网示例Dynamic clusters解析——动态的聚合图层

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/clusters-dynamic.html 这篇绘制了多个聚合图层。 先初始化地图 &#xff0c;设置了地图视角的边界extent&#xff0c;限制了地图缩放的范围 initMap() {const raster new TileLayer({source: new XYZ…

JAVA流程控制break,continue,goto

1.break在任何循环语句的主体成分&#xff0c;均可用break控制循环的流程。break用于强行退出循环&#xff0c;不执行循环中剩余的语句。&#xff08;break语句也在switch语句中使用&#xff09; 如图&#xff1a;break语句强行退出循环&#xff0c;结果输出1~30便结束&#xf…

两数之和-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第76讲。 两数之和&#xf…

Java面试八股之死锁和活锁的区别

死锁和活锁的区别 基本定义&#xff1a; 死锁&#xff08;Deadlock&#xff09;&#xff1a;指两个或多个线程互相等待对方释放资源&#xff0c;从而导致所有线程都无法继续执行的状态。每个线程至少持有一个资源&#xff0c;并等待另一个由其他线程持有的资源&#xff0c;形…

初始操作系统

概念&#xff1a; 1.系统资源的管理者&#xff1a;实质控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机地工作和资源的分配 2.向上层提供方便易用的服务&#xff1a;以提供给用户和其他软件方便接口和环境 封装思想&#xff1a;操作系统把一些丑…

阿里云服务器接入百度云防护后显示502原因

最近&#xff0c;发现很多使用了阿里云服务器的网站出现502的情况 经百度云防护技术排查发现阿里云机房对百度云防护的IP进行了拦截&#xff0c;原因近期可能是百度云防护的IP请求过于频繁&#xff0c;导致阿里云机房策略把百度云的IP当成了攻击IP。 解决办法是提交工单让阿里…