“揭秘乐园通行证:Spring JWT的魔法之旅

news2025/1/10 16:20:20

嗨,我将带你深入了解如何利用JWT打造一个既安全又高效的网络乐园。从基础概念到实战技巧,再到安全策略,每一步都充满惊喜。你将学会如何为乐园设置无状态的门票系统,如何通过RBAC和ABAC确保游客安全,以及如何在微服务架构中共享这些神奇的通行证。准备好了吗?让我们一起开启这段魔法之旅!

文章目录

    • 1. 引言
      • JWT的概念与重要性
      • Spring框架整合JWT的目的与优势
    • 2. 背景介绍
      • 2.1 JWT基础
      • 2.2 Spring Security简介
    • 3. Spring Boot中JWT的集成
      • 3.1 添加依赖与配置
      • 3.2 创建JWT过滤器
      • 3.3 用户登录与JWT生成
    • 4. JWT令牌的有效性管理
      • 4.1 令牌过期时间设置
      • 4.2 令牌刷新机制
      • 4.3 黑名单与令牌撤销
    • 5. 安全增强与自定义需求
      • 5.1 权限控制(RBAC/ABAC)
      • 5.2 多租户支持
      • 5.3 CORS与CSRF防护
    • 6. 结论
      • Spring与JWT结合的关键优势
      • 未来趋势与最佳实践建议

在这里插入图片描述

1. 引言

今天,我要给大家讲一个关于“令牌”的故事,这个令牌不是普通的令牌,它叫做JWT(JSON Web Tokens)。想象一下,你手里拿着一张神奇的门票,这张门票可以让你进入一个神秘的乐园,而这个乐园就是由Spring框架构建的网络世界。

JWT的概念与重要性

JWT,听起来像是某种神秘的咒语,但它实际上是一种开放标准(RFC 7519),用于在网络应用环境间传递声明(claims)以一种JSON对象的形式。简单来说,它就像一张电子身份证,让你在网络世界中自由穿梭,而不需要每次都重新登录。

Spring框架整合JWT的目的与优势

那么,为什么我们要在Spring框架中整合JWT呢?想象一下,你手里的门票如果只能在一个乐园里使用,那多无趣啊。Spring框架整合JWT的目的,就是为了让这张门票在多个乐园之间通用,让你的网络应用更加灵活和强大。

整合JWT后,我们的优势就显而易见了:

  • 无状态和可扩展性:JWT令牌不需要服务器存储会话信息,这意味着服务器可以快速处理请求,而且可以轻松扩展。
  • 跨域认证:JWT可以轻松地在不同域之间传递,这对于构建微服务架构尤为重要。
  • 安全性:JWT可以通过签名算法(如HS256, RS256等)确保令牌的完整性和安全性。

接下来,我们将深入了解JWT的奥秘,以及如何在Spring框架中巧妙地使用它。别着急,故事才刚刚开始,让我们一步步揭开它的神秘面纱。

2. 背景介绍

2.1 JWT基础

在我们的故事中,JWT就像一位拥有超能力的超级英雄,它由三个部分组成:Header(头部)、Payload(负载)和Signature(签名)。想象一下,超级英雄的头部是它的面具,它隐藏了英雄的真实身份;负载是英雄的装备,包含了各种信息;而签名则是英雄的印记,证明它的真实性。

  • Header(头部):通常包含两部分,token的类型(这里是JWT)和所使用的签名算法(如HS256, RS256等)。
  • Payload(负载):这是JWT的主体部分,包含了所谓的Claims(声明),比如用户的ID、名字、角色等信息,以及一个非常重要的exp声明,它告诉我们这张令牌何时过期。
  • Signature(签名):这是JWT的保护层,使用密钥对头部和负载进行加密,确保令牌在传输过程中不被篡改。

2.2 Spring Security简介

现在,让我们来到Spring Security的世界。Spring Security是一个功能强大且高度可定制的Java安全框架,用于保护基于Spring的应用程序。它的核心功能包括认证、授权、防止CSRF攻击等。

  • 传统会话认证:在传统的认证机制中,用户登录后,服务器会生成一个会话,并将这个会话存储在服务器上。每次用户请求时,都需要携带会话ID,服务器通过会话ID来识别用户。
  • JWT认证:与传统会话认证不同,JWT认证不需要服务器存储会话信息。用户登录成功后,服务器生成一个JWT令牌,用户在之后的请求中携带这个令牌,服务器通过解析令牌来认证用户。

对比两者,JWT认证的优势在于:

  • 无状态:服务器不需要存储会话信息,减轻了服务器的负担。
  • 跨域:JWT可以在不同的服务和域之间传递,非常适合分布式系统。
  • 自包含:JWT包含了所有必要的用户信息,减少了服务器的查询次数。

通过将JWT与Spring Security结合,我们不仅能够享受到JWT带来的便利,还能利用Spring Security提供的高级安全特性,打造一个既安全又高效的网络应用。

好了,故事的背景已经介绍完毕,接下来我们将进入实战环节,看看如何在Spring Boot中集成JWT,让我们的应用变得更加强大。别着急,跟着我的步伐,一步步来。

3. Spring Boot中JWT的集成

3.1 添加依赖与配置

想象一下,你正在厨房里准备做一道美味的菜肴,首先你需要准备食材和调料。在Spring Boot中集成JWT也是同样的道理,我们首先需要添加一些“食材”和“调料”——也就是依赖和配置。

首先,打开你的pom.xml文件,加入以下依赖:

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

<!-- JWT -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

这就像是在超市购物,把需要的食材放进购物车。接下来,我们需要准备“调料”——配置文件。

application.propertiesapplication.yml中,添加一些基本配置:

# 假设你的密钥是secretKey,实际使用时应该更复杂一些
jwt.secret=secretKey

在这里插入图片描述

3.2 创建JWT过滤器

现在,食材和调料都准备好了,我们可以开始烹饪了。首先,我们需要一个过滤器来“过滤”请求,确保每个请求都携带了JWT令牌。

创建一个名为JwtAuthenticationFilter的类,并实现Filter接口:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        
        // 从请求头中获取Authorization
        String authorizationHeader = request.getHeader("Authorization");

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            // 提取令牌
            String jwtToken = authorizationHeader.substring(7);
            try {
                // 验证令牌
                Claims claims = Jwts.parser()
                        .setSigningKey(jwt.secret.getBytes())
                        .parseClaimsJws(jwtToken)
                        .getBody();
                
                // 如果令牌有效,继续执行请求
                filterChain.doFilter(request, response);
            } catch (JwtException | IllegalArgumentException e) {
                // 如果令牌无效或过期,返回401错误
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            }
        } else {
            // 如果请求头中没有Authorization或不是Bearer类型,返回401错误
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }
}

这个过滤器就像是厨房里的筛子,帮助我们筛选出那些携带了“门票”的请求。

3.3 用户登录与JWT生成

现在,我们的厨房已经准备好了,可以开始做主菜了。用户登录接口就是这道菜的“主料”。

假设你有一个用户登录的接口/login,用户提交用户名和密码后,服务器会验证这些信息。如果验证成功,服务器将生成一个JWT令牌并返回给用户。

@RestController
@RequestMapping("/api")
public class AuthenticationController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping("/login")
    public ResponseEntity<?> createAuthenticationToken(@RequestBody LoginRequest loginRequest) throws Exception {
        authenticate(loginRequest.getUsername(), loginRequest.getPassword());
        final String token = jwtTokenUtil.generateToken(loginRequest.getUsername());
        return ResponseEntity.ok(new AuthenticationResponse(token));
    }
}

这里的jwtTokenUtil是一个工具类,负责生成JWT令牌。生成令牌的过程就像是把各种食材混合在一起,然后放进烤箱烘烤。

这样,当用户登录成功后,他们就会收到一个JWT令牌,这个令牌就像是一张入场券,可以让他们进入我们的网络乐园。

好了,我们的主菜已经准备好了,接下来我们将进入更高级的烹饪技巧——JWT令牌的有效性管理。别着急,跟着我的步伐,一步步来。

4. JWT令牌的有效性管理

4.1 令牌过期时间设置

在网络世界里,每张令牌都有它的保质期。就像超市里的牛奶,过期了就不能喝了。在JWT的世界里,我们通过exp声明来告诉用户,这张令牌什么时候会过期。

想象一下,你是超市的收银员,每次给牛奶贴上标签的时候,都会写上一个过期日期。在JWT中,我们也是这么做的:

String token = Jwts.builder()
    .setSubject("username") // 用户名
    .setIssuedAt(new Date()) // 签发时间
    .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 设置过期时间为当前时间后的10小时
    .signWith(SignatureAlgorithm.HS256, "secretKey".getBytes()).compact();

这段代码就像是给牛奶贴上标签,告诉用户这张令牌将在10小时后过期。

4.2 令牌刷新机制

但是,如果用户不想每隔10小时就重新登录一次怎么办?这时候,我们就需要一个令牌刷新机制,就像超市里的牛奶,快过期的时候可以重新贴上一个新的标签。

我们可以设计一个刷新令牌(Refresh Token),它比普通的访问令牌(Access Token)有更长的有效期。当访问令牌过期时,用户可以使用刷新令牌来获取一个新的访问令牌。

@PostMapping("/refresh")
public ResponseEntity<?> refreshAuthenticationToken(@RequestBody RefreshTokenRequest request) {
    String oldToken = request.getToken();
    try {
        Claims claims = Jwts.parser()
                .setSigningKey("secretKey".getBytes())
                .parseClaimsJws(oldToken)
                .getBody();
        
        // 验证刷新令牌是否有效
        if (claims.get("refresh", Boolean.class)) {
            String username = claims.getSubject();
            String newToken = Jwts.builder()
                    .setSubject(username)
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10))
                    .signWith(SignatureAlgorithm.HS256, "secretKey".getBytes())
                    .compact();
            return ResponseEntity.ok(new AuthenticationResponse(newToken));
        }
    } catch (JwtException | IllegalArgumentException e) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }
    return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}

这段代码就像是超市的收银员检查牛奶的标签,如果发现快过期了,就贴上一个新的标签。

4.3 黑名单与令牌撤销

在网络世界里,有时候令牌可能会落入坏人手中,就像是超市的牛奶被偷走了。为了防止这种情况,我们需要一个黑名单系统,来记录那些被偷走的令牌。

我们可以创建一个服务来管理这些黑名单令牌,并在每次验证令牌时检查它们是否在黑名单上:

@Service
public class BlacklistService {

    private Set<String> blacklist = ConcurrentHashMap.newKeySet();

    public void addTokenToBlacklist(String token) {
        blacklist.add(token);
    }

    public boolean isTokenInBlacklist(String token) {
        return blacklist.contains(token);
    }
}

每次令牌验证时,我们都会调用isTokenInBlacklist方法来检查令牌是否在黑名单上:

if (blacklistService.isTokenInBlacklist(jwtToken)) {
    throw new JwtException("Token is blacklisted");
}

这样,即使令牌被偷走了,我们也能确保它不会被使用。

好了,我们的令牌管理故事就讲到这里。接下来,我们将进入更高级的话题,比如权限控制和多租户支持。别着急,跟着我的步伐,一步步来。

5. 安全增强与自定义需求

5.1 权限控制(RBAC/ABAC)

想象一下,你手里的JWT令牌不仅是一张门票,还是一张VIP卡,它决定了你在乐园里能去哪些地方,能玩哪些游戏。这就是权限控制的魅力所在。

在Spring Security的世界里,我们有两种流行的权限控制模型:RBAC(基于角色的访问控制)和ABAC(基于属性的访问控制)。

RBAC就像是乐园里的导游图,上面标明了不同角色可以访问的区域。比如,普通游客只能去儿童乐园,而VIP游客可以去所有的区域。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/public/**").permitAll() // 所有人都能访问公共区域
            .antMatchers("/admin/**").hasRole("ADMIN") // 只有管理员角色能访问管理员区域
            .anyRequest().authenticated() // 其他所有请求都需要认证
        .and()
        // 其他配置...
}

ABAC则更加灵活,它允许你根据用户的属性(比如年龄、VIP等级等)来控制访问权限。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().access(new PreAuthorizeAuthenticationProvider() {
                @Override
                public boolean hasPermission(Authentication authentication, Object details) {
                    // 根据用户属性决定是否允许访问
                    return authentication.getName().equals("VIP");
                }
            })
        .and()
        // 其他配置...
}

5.2 多租户支持

在网络世界里,有时候一个应用需要服务于多个“房东”,这就是多租户支持。想象一下,一个乐园里有多个不同的主题区域,每个区域都有自己的规则和装饰。

在JWT中携带租户信息,就像是给每个主题区域的门票上印上特定的标记,这样我们就能知道这张门票是属于哪个区域的。

String token = Jwts.builder()
    .setSubject("username")
    .setClaim("tenant", "tenantId") // 添加租户信息
    // 其他设置...
    .compact();

在服务端,我们可以检查这个租户信息,确保用户只能访问他们自己的区域。

5.3 CORS与CSRF防护

在网络世界里,有时候一些不怀好意的“邻居”会试图闯入你的乐园。这就是CORS(跨源资源共享)和CSRF(跨站请求伪造)防护的重要性。

CORS就像是乐园的围墙,防止未经授权的访问。在Spring Security中,我们可以这样配置CORS:

http
    .cors() // 启用CORS支持
    .and()
    // 其他配置...

CSRF防护则是乐园的保安,确保只有持有正确门票的人才能进入。Spring Security默认启用CSRF防护,但如果你使用JWT,可能需要禁用它,因为JWT是无状态的。

http
    .csrf().disable() // 禁用CSRF防护
    // 其他配置...

但是,禁用CSRF防护并不意味着我们的乐园就不安全了,我们可以通过其他方式来增强安全性,比如验证请求的来源等。

好了,我们的安全增强和自定义需求就介绍到这里。接下来,我们将探讨一些经典问题和解决方案,让你的乐园更加安全和有趣。别着急,跟着我的步伐,一步步来。
在这里插入图片描述

6. 结论

Spring与JWT结合的关键优势

咱们的故事快要到尾声了,但在这之前,让我们来总结一下Spring和JWT结合的这场奇妙冒险的关键优势。

无状态的乐园:Spring和JWT的结合,就像是在乐园里搭起了一个无状态的帐篷,游客们可以自由地穿梭,而乐园的管理者们则可以轻松地管理一切。

扩展性:想象一下,你的乐园需要扩建,增加更多的游乐设施和区域,JWT让你的乐园可以无缝扩展,迎接更多的游客。

安全性:通过JWT,你的乐园有了一层额外的安全保障,就像是一道坚固的围墙,保护着乐园里的每一位游客。

未来趋势与最佳实践建议

持续学习:技术的世界总是在变化,所以保持好奇心,持续学习新的安全协议和最佳实践是非常重要的。

拥抱微服务:随着微服务架构的流行,JWT作为一种轻量级的身份验证方式,将会越来越受到欢迎。

个性化体验:利用JWT携带的用户信息,可以为游客提供更加个性化的体验,让每位游客都感到自己被特别对待。

社区贡献:不要忘记,你也是这个大社区的一部分,分享你的知识和经验,帮助他人,同时也能获得成长。

代码示例:最后,让我们以一个简单的代码示例作为结束,展示如何在你的Spring应用中启用JWT。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationFilter jwtAuthenticationFilter;

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable() // 禁用CSRF,因为JWT是无状态的
            .authorizeRequests()
                .antMatchers("/api/public/**").permitAll() // 公共端点允许所有人访问
                .anyRequest().authenticated() // 其他所有请求都需要认证
            .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // 无状态会话
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAuthenticationFilter authenticationTokenFilterBean() throws Exception {
        return new JwtAuthenticationFilter(authenticationManager, jwtUserDetailsService());
    }

    @Bean
    public JwtUserDetailsService jwtUserDetailsService() {
        return new JwtUserDetailsService();
    }
}

这段代码就像是乐园的入口,确保每位游客都能安全、顺利地进入乐园。

随着故事的结束,我们的JWT之旅也告一段落。希望你喜欢这次旅行,也希望这些知识和经验能够帮助你在构建网络应用时更加得心应手。记得,无论何时,安全总是第一位的,让我们一起构建一个更加安全、高效的网络世界吧!

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

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

相关文章

统计信号处理-匹配滤波器实现与验证(matlab仿真)

什么是匹配滤波器 匹配滤波器是一种信号处理技术&#xff0c;它用于从噪声中提取信号&#xff0c;特别是在信号与噪声比率较低的情况下。匹配滤波器之所以存在&#xff0c;是因为它在信号检测和估计方面具有几个关键的优势&#xff1a; 最大化信噪比&#xff1a;匹配滤波器设计…

数字化校园建设让学习更加广阔

校园构建数字化校园的亮点是什么&#xff1f;校园以智能服务、才智办理、数字讲堂为中心内容的智慧校园建造&#xff0c;不只使师生作业和日子更高效&#xff0c;并且使他们有更多的时刻投入到智能教育和智能学习中去&#xff0c;进步教育质量&#xff0c;使学生走出校门时紧跟…

项目管理主要文档介绍

1、商业论证&#xff1a;一般由项目发起人创建&#xff0c;用于论证项目是否对组织有财务方面的收益。商业论证创建于项日开始之前&#xff0c;用于判断项目是否需要被开展。 2、项目章程&#xff1a;一般由项日经理创建,并由发起入和关键相关力提供输人&#xff0c;最后经项目…

MATLAB函数模块光显示zeros/poles怎么办?

出现下面这种图了怎么办&#xff1f;是做错了吗&#xff1f; 这种图就是它显示不完整了&#xff0c;把它拉大点就可以完全显示了。

【机器学习】深入探索机器学习:利用机器学习探索股票价格预测的新路径

❀机器学习 &#x1f4d2;1. 引言&#x1f4d2;2. 多种机器学习算法的应用&#x1f4d2;3. 机器学习在股票价格预测中的应用现状&#x1f389;数据收集与预处理&#x1f389;模型构建与训练&#x1f308;模型评估与预测&#x1f31e;模型评估&#x1f319;模型预测⭐注意事项 &…

检定记录内容解析:非红外二氧化硫气体检测仪的维护与验证

在工业生产与环境保护中&#xff0c;二氧化硫作为一种常见的有害气体&#xff0c;其浓度的监测和控制显得尤为重要。 非红外二氧化硫气体检测仪以其独特的检测原理和高灵敏度&#xff0c;在二氧化硫监测领域发挥着不可或缺的作用。 在这篇文章中&#xff0c;佰德将详细介绍非…

【原创】springboot+mysql校园通讯录管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

MongoDB CRUD操作:插入文档

MongoDB CRUD操作&#xff1a;插入文档 文章目录 MongoDB CRUD操作&#xff1a;插入文档使用MongoDB Atlas UI插入文档插入单个文档插入多个文档插入行为自动创建集合_id字段原子性写确认 在MongoDB中插入文档的集中方式&#xff1a; 使用编程语言提供的驱动程序&#xff0c;在…

【第七节】C++的STL基本使用

目录 前言 一、STL简介 1.1 STL基本概念 1.2 STL六大组件 1.3 STL优点 二、STL三大组件 2.1 容器 2.2 算法 2.3 迭代器 三、STL常见的容器 3.1 string容器 3.1.1 string容器基本概念 3.1.2 string容器的常用操作 3.1.2.1 string 构造函数 3.1.2.2 string 基本赋…

U盘格式化怎么操作?快来学这4种法

U盘格式化怎么操作&#xff1f;在计算机领域中&#xff0c;格式化通常指对存储设备&#xff08;如硬盘、U盘&#xff09;进行格式化操作&#xff0c;清空其中的数据并重新建立文件系统&#xff0c;以便进行数据存储和管理。 U盘格式化一共有哪些方法&#xff1f;在格式化U盘之…

SJ701-II安全帽耐冲击穿刺测试仪

一、主要用途 主要用于安全帽耐冲击性能和耐穿刺性能试验。 二、仪器特征 整机创新全新结构&#xff0c;并获得国家专利&#xff08;专利号201420182139.8&#xff09; 1、整机结构&#xff1a;首创采用欧标型材组装成型&#xff0c;内藏式线路折叠式结构。结构美观耐用&…

07.爬虫---使用session发送请求

07.使用session发送请求 1.目标网站2.代码实现 1.目标网站 我们以这个网站作为目标网站 http://www.360doc.com/ 注册用户 注册后从登录界面获取到这些信息 2.代码实现 import requestssession requests.Session() url http://www.360doc.com/ajax/login/login.ashx u…

基于SSM框架的手机商城项目

后端: 订单管理 客户管理&#xff1a; 商品管理 类目管理 前端&#xff1a; 首页&#xff1a;

windows 在cmd 使用cd命令无法进入指定目录解决方法

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用cmd命令想要快速进入某个目录&#xff0c;发现没有跳转&#xff0c;如下&#xff1a; 二、原因分析 cmd 切换目录跨磁盘的话&#xff0c;需要先进行磁盘的转换&#xff0c;也就是要进入到另外一…

码蹄集部分题目(2024OJ赛17期;二分+差分+ST表+单调队列+单调栈)

1&#x1f40b;&#x1f40b;小码哥处理订单&#xff08;钻石&#xff1b;二分差分&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;题目思路 【码蹄集进阶塔全题解07】算法基础&#xff1a;二分 MT2070 – MT2079_哔哩…

Kafka系列之高频面试题

基础 简介 特点&#xff1a; 高吞吐、低延迟&#xff1a;kafka每秒可以处理几十万条消息&#xff0c;延迟最低只有几毫秒&#xff0c;每个Topic可以分多个Partition&#xff0c;Consumer Group对Partition进行Consumer操作可扩展性&#xff1a;Kafka集群支持热扩展持久性、可…

JavaScript解构赋值

一、数组解构 以上要么不好记忆&#xff0c;要么书写麻烦&#xff0c;此时可以使用解构赋值的方法让代码更简洁。 数组解构是将数组的单元值快速批量赋值给一系列变量的简洁语法。 基本语法&#xff1a; 1、赋值运算符左侧的[]用于批量声明变量&#xff0c;右侧数组的单元值将…

库卡机械手伺服电机过压报警维修措施

一、KUKA机械手伺服电机过压报警原因库卡机器人电机过压报警通常是由于电机供电电压过高、电机绕组短路、电机负载过大等原因引起的。当电机供电电压超过额定电压一定范围&#xff0c;或者电机绕组出现短路故障&#xff0c;或者电机负载过大导致电流过大时&#xff0c;电机电流…

MoeCTF 2022 usb

直接找 URB的第一个输入协议 我们需要提取的数据 HID Data 提取过滤器 tshark -r usb.pcapng -Y "usb.src\"2.2.1\"" -T json >1.json 拿 usbhid.data 字段 tshark -r usb.pcapng -Y "usb.src\"2.2.1\"" -T json -e usbhid.data …

【LINUX】LINUX基础(目录结构、基本权限、基本命令)

文章目录 LINUX的目录结构LINUX的基本权限LINUX基本命令 LINUX的目录结构 /&#xff1a;表示根目录bin&#xff1a;存放二进制可执行文件(命令ls、cat、mkdir等)boot&#xff1a;存放系统引导文件dev&#xff1a;存放设备文件etc&#xff1a;存放系统配置文件home&#xff1a;…