MyBatis-Plus数据安全保护(加密解密)

news2024/11/29 8:40:26
  1. 项目创建
  2. POM依赖
    <dependency><!--MyBatis-Plus 企业级模块-->
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-mate-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bctls-jdk15on -->
    <dependency><!--SM2 SM3 SM4 加密算法依赖-->
        <groupId>org.bouncycastle</groupId>
        <artifactId>bctls-jdk15on</artifactId>
        <version>1.70</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.jasypt/jasypt -->
    <dependency><!--混合加密算法依赖-->
        <groupId>org.jasypt</groupId>
        <artifactId>jasypt</artifactId>
        <version>1.9.3</version>
    </dependency>
  3. YML配置
    spring:
      datasource:
        # 配置安全:https://blog.csdn.net/tongxin_tongmeng/article/details/128664932
        url: mpw:IlcV2VrLIr+z3ruf0oHP1sV3JuEvntw9QZDEYhQWDNHJ9Xkm7qZokxkEeTCPNqma
        username: mpw:aoVz0lDJNymnmrhw6LkQow==
        password: mpw:StRVtLG7vB6iKVt83du7fw==
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    # Mybatis Mate 配置
    mybatis-mate:
      cert:
        # 请添加微信wx153666购买授权,不白嫖从我做起! 测试证书会失效,请勿正式环境使用
        grant: thisIsTestLicense
        license: TtY9GC88CzSkEmUhzIyvM2MJKvsgPyxoNCExH4/GhaBwuTQ93aeLaR6/dM49wMSk+oQdmqUibCM8b5H74s1Nx+2C5V3U1gKiLtddVc8Eg8oC1F2nLxOiDKDvPpdxWFGsPW6mQE2LDr+tK8GXpFS3N8xwmYy/gHCwQ4Avqp9JqBbke7pZzL2adIlxYHmCYpfNTN+NRHIEFaGFTBlzZHDb3UfJaeqLaAtWBol0QOPEM69Kz3JSemxBHnEO1ID75bwwmkgqC7Ps4z9iYAK9GLzzaPwSiFELNCmIvwa5YSJLxP9NMQUWbVGIRqehxnVqfgx/68+yIfpByqGTMxLR33yeEQ==
      # 全局配置加密算法密钥
      encryptor:
        # MD5_32 MD5_16 BASE64 AES SM2 SM3 SM4 需要 password,其他加密算法需要 password publicKey privateKey
        password: mybatis-mate-encryptor-password-666
        publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCEOCMScPeNaJ0DP9N9vd/fXwPGUVnuxeGPpRePXfWuX/X/Yk5IMhwEfYLXictxQk/oAqGnqtDuS/PCL/7mqL+8wFSYnWWErCSkDdT6LjyD07l9dWv+Xj1UTEjP24sEgYA92f4AZyvhsw8I/Bj6a9a30r+kVOGoEZgGMf2c2xK4CQIDAQAB
        privateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIQ4IxJw941onQM/0329399fA8ZRWe7F4Y+lF49d9a5f9f9iTkgyHAR9gteJy3FCT+gCoaeq0O5L88Iv/uaov7zAVJidZYSsJKQN1PouPIPTuX11a/5ePVRMSM/biwSBgD3Z/gBnK+GzDwj8GPpr1rfSv6RU4agRmAYx/ZzbErgJAgMBAAECgYBAlFK9DSQ8k14tWh1oizcvmO71DIMKluhHCvHo+pGnLAOxS0jFBoScxNkFga42kZcJ0U8337zQx5Q1ws+TxdRwHxQO889ZGQH3kOFB0ErUMTgFrTOakZhV0dMWzebkYitNcduSKZ1yfgM5ekF9k3owPIQhUNy8eXjagiLLb9/woQJBALwofOx+fuanQLC1yotFqYAx0XED9EpVPhS/G8mc4dZSNWZ548bIyq3ozP0CoHqriQo/X3NVzIJOU3rhn92fwj0CQQCz5FaeHzSqe1H4bTxzwgR5BUHttxrAPtktwfgCRgaSrZByjFldtP/dGaJmjR2Vzp848WcusJZlSlaLTfndm6W9AkEAoSxlZgctGNKn3Ta7mvU/Lmp+J7rlZU8DcK4LVXYnFXkx+OfsLvkMdE/4V7oKUUnih36lepxCJFSHubjPQf55WQJBAIUa8yxUkreCQAi9avmMGZsiVMH7tgOBfVjqKQQlpD9rxXG8f3Nitd93VD7lM3rhQ9byaBKX/vA7rQWuUK+0t1ECQDTGhLRJFZK4J7UGklTX94pknM/5rO3N/JPkFJcGilbgzkqy0s13D1K+8cR0qTn2DPW8vPoLQpVGuaATTTmMdvg=
    
    @SpringBootTest
    class MybatisPlusApplicationTests {
    
        @Test
        void contextLoads() throws Exception {
            Map<String, Key> keyMap = RSA.genKeyPair();
            String publicKey = RSA.getPublicKey(keyMap);
            String privateKey = RSA.getPrivateKey(keyMap);
            System.out.println("publicKey========="+publicKey);
            System.out.println("privateKey========="+privateKey);
        }
    
    }
    
    注意:password为任意字符串,publicKey和privateKey通过如上方法生成
  4. SQL脚本
    CREATE TABLE `encrypt` (
      `id` bigint NOT NULL COMMENT '主键ID',
      `MD5_32` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'MD5_32',
      `MD5_16` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'MD5_16',
      `BASE64` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'BASE64',
      `AES` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'AES',
      `RSA` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'RSA',
      `SM2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'SM2',
      `SM3` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'SM3',
      `SM4` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'SM4',
      `PBEWithMD5AndDES` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'PBEWithMD5AndDES',
      `PBEWithMD5AndTripleDES` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'PBEWithMD5AndTripleDES',
      `PBEWithHMACSHA512AndAES_256` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'PBEWithHMACSHA512AndAES_256',
      `PBEWithSHA1AndDESede` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'PBEWithSHA1AndDESede',
      `PBEWithSHA1AndRC2_40` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'PBEWithSHA1AndRC2_40',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  5. 代码生成(MybatisX)
    @RestController
    @RequestMapping("/encrypt")
    public class EncryptController {
    
        @Autowired
        private EncryptService encrtptService;
    
        @PostMapping("/create")
        public Boolean create(@RequestBody Encrypt encrypt) {
            return encrtptService.save(encrypt);
        }
    
        @GetMapping("/get")
        public Encrypt get(@RequestBody Encrypt encrypt) {
            return encrtptService.getById(encrypt.getId());
        }
    
        @GetMapping("/getAll")
        public List<Encrypt> getAll() {
            return encrtptService.list();
        }
    
        @PutMapping("/update")
        public Boolean update(@RequestBody Encrypt encrypt) {
            return encrtptService.updateById(encrypt);
        }
    
        @DeleteMapping("/delete")
        public Boolean delete(@RequestBody Encrypt encrypt) {
            return encrtptService.removeById(encrypt);
        }
    
        @DeleteMapping("/deleteAll")
        public Boolean deleteAll() {
            return encrtptService.remove(new QueryWrapper<>());
        }
    
    }
  6. 加密算法
  7. 字段加密(@FieldEncrypt)
    /**
     *
     * @TableName encrypt
     */
    @TableName(value ="encrypt")
    @Data
    public class Encrypt implements Serializable {
        /**
         * 主键ID
         */
        @TableId(value = "id")
        private Long id;
    
        /**
         * MD5_32
         */
        @FieldEncrypt(algorithm = Algorithm.MD5_32)
        @TableField(value = "MD5_32")
        private String md532;
    
        /**
         * MD5_16
         */
        @FieldEncrypt(algorithm = Algorithm.MD5_16)
        @TableField(value = "MD5_16")
        private String md516;
    
        /**
         * BASE64
         */
        @FieldEncrypt(algorithm = Algorithm.BASE64)
        @TableField(value = "BASE64")
        private String base64;
    
        /**
         * AES
         */
        @FieldEncrypt(algorithm = Algorithm.AES)
        @TableField(value = "AES")
        private String aes;
    
        /**
         * RSA
         */
        @FieldEncrypt(algorithm = Algorithm.RSA)
        @TableField(value = "RSA")
        private String rsa;
    
        /**
         * SM2
         */
        @FieldEncrypt(algorithm = Algorithm.SM2)
        @TableField(value = "SM2")
        private String sm2;
    
        /**
         * SM3
         */
        @FieldEncrypt(algorithm = Algorithm.SM3)
        @TableField(value = "SM3")
        private String sm3;
    
        /**
         * SM4
         */
        @FieldEncrypt(algorithm = Algorithm.SM4)
        @TableField(value = "SM4")
        private String sm4;
    
        /**
         * PBEWithMD5AndDES
         */
        @FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
        @TableField(value = "PBEWithMD5AndDES")
        private String pbewithmd5anddes;
    
        /**
         * PBEWithMD5AndTripleDES
         */
        @FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndTripleDES)
        @TableField(value = "PBEWithMD5AndTripleDES")
        private String pbewithmd5andtripledes;
    
        /**
         * PBEWithHMACSHA512AndAES_256
         */
        @FieldEncrypt(algorithm = Algorithm.PBEWithHMACSHA512AndAES_256)
        @TableField(value = "PBEWithHMACSHA512AndAES_256")
        private String pbewithhmacsha512andaes256;
    
        /**
         * PBEWithSHA1AndDESede
         */
        @FieldEncrypt(algorithm = Algorithm.PBEWithSHA1AndDESede)
        @TableField(value = "PBEWithSHA1AndDESede")
        private String pbewithsha1anddesede;
    
        /**
         * PBEWithSHA1AndRC2_40
         */
        @FieldEncrypt(algorithm = Algorithm.PBEWithSHA1AndRC2_40)
        @TableField(value = "PBEWithSHA1AndRC2_40")
        private String pbewithsha1andrc240;
    
        @TableField(exist = false)
        private static final long serialVersionUID = 1L;
    
        @Override
        public boolean equals(Object that) {
            if (this == that) {
                return true;
            }
            if (that == null) {
                return false;
            }
            if (getClass() != that.getClass()) {
                return false;
            }
            Encrypt other = (Encrypt) that;
            return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
                && (this.getMd532() == null ? other.getMd532() == null : this.getMd532().equals(other.getMd532()))
                && (this.getMd516() == null ? other.getMd516() == null : this.getMd516().equals(other.getMd516()))
                && (this.getBase64() == null ? other.getBase64() == null : this.getBase64().equals(other.getBase64()))
                && (this.getAes() == null ? other.getAes() == null : this.getAes().equals(other.getAes()))
                && (this.getRsa() == null ? other.getRsa() == null : this.getRsa().equals(other.getRsa()))
                && (this.getSm2() == null ? other.getSm2() == null : this.getSm2().equals(other.getSm2()))
                && (this.getSm3() == null ? other.getSm3() == null : this.getSm3().equals(other.getSm3()))
                && (this.getSm4() == null ? other.getSm4() == null : this.getSm4().equals(other.getSm4()))
                && (this.getPbewithmd5anddes() == null ? other.getPbewithmd5anddes() == null : this.getPbewithmd5anddes().equals(other.getPbewithmd5anddes()))
                && (this.getPbewithmd5andtripledes() == null ? other.getPbewithmd5andtripledes() == null : this.getPbewithmd5andtripledes().equals(other.getPbewithmd5andtripledes()))
                && (this.getPbewithhmacsha512andaes256() == null ? other.getPbewithhmacsha512andaes256() == null : this.getPbewithhmacsha512andaes256().equals(other.getPbewithhmacsha512andaes256()))
                && (this.getPbewithsha1anddesede() == null ? other.getPbewithsha1anddesede() == null : this.getPbewithsha1anddesede().equals(other.getPbewithsha1anddesede()))
                && (this.getPbewithsha1andrc240() == null ? other.getPbewithsha1andrc240() == null : this.getPbewithsha1andrc240().equals(other.getPbewithsha1andrc240()));
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
            result = prime * result + ((getMd532() == null) ? 0 : getMd532().hashCode());
            result = prime * result + ((getMd516() == null) ? 0 : getMd516().hashCode());
            result = prime * result + ((getBase64() == null) ? 0 : getBase64().hashCode());
            result = prime * result + ((getAes() == null) ? 0 : getAes().hashCode());
            result = prime * result + ((getRsa() == null) ? 0 : getRsa().hashCode());
            result = prime * result + ((getSm2() == null) ? 0 : getSm2().hashCode());
            result = prime * result + ((getSm3() == null) ? 0 : getSm3().hashCode());
            result = prime * result + ((getSm4() == null) ? 0 : getSm4().hashCode());
            result = prime * result + ((getPbewithmd5anddes() == null) ? 0 : getPbewithmd5anddes().hashCode());
            result = prime * result + ((getPbewithmd5andtripledes() == null) ? 0 : getPbewithmd5andtripledes().hashCode());
            result = prime * result + ((getPbewithhmacsha512andaes256() == null) ? 0 : getPbewithhmacsha512andaes256().hashCode());
            result = prime * result + ((getPbewithsha1anddesede() == null) ? 0 : getPbewithsha1anddesede().hashCode());
            result = prime * result + ((getPbewithsha1andrc240() == null) ? 0 : getPbewithsha1andrc240().hashCode());
            return result;
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            sb.append(getClass().getSimpleName());
            sb.append(" [");
            sb.append("Hash = ").append(hashCode());
            sb.append(", id=").append(id);
            sb.append(", md532=").append(md532);
            sb.append(", md516=").append(md516);
            sb.append(", base64=").append(base64);
            sb.append(", aes=").append(aes);
            sb.append(", rsa=").append(rsa);
            sb.append(", sm2=").append(sm2);
            sb.append(", sm3=").append(sm3);
            sb.append(", sm4=").append(sm4);
            sb.append(", pbewithmd5anddes=").append(pbewithmd5anddes);
            sb.append(", pbewithmd5andtripledes=").append(pbewithmd5andtripledes);
            sb.append(", pbewithhmacsha512andaes256=").append(pbewithhmacsha512andaes256);
            sb.append(", pbewithsha1anddesede=").append(pbewithsha1anddesede);
            sb.append(", pbewithsha1andrc240=").append(pbewithsha1andrc240);
            sb.append(", serialVersionUID=").append(serialVersionUID);
            sb.append("]");
            return sb.toString();
        }
    }
  8. 加密测试
    加密前:
    {
    	"md532": "md532",
    	"md516": "md516",
    	"base64": "base64",
    	"aes": "aes",
    	"rsa": "rsa",
    	"sm2": "sm2",
    	"sm3": "sm3",
    	"sm4": "sm4",
    	"pbewithmd5anddes": "pbewithmd5anddes",
    	"pbewithmd5andtripledes": "pbewithmd5andtripledes",
    	"pbewithhmacsha512andaes256": "pbewithhmacsha512andaes256",
    	"pbewithsha1anddesede": "pbewithsha1anddesede",
    	"pbewithsha1andrc240": "pbewithsha1andrc240"
    }
    
    注意:调用控制器接口向数据库插入数据

    加密后:
    {
        "id": "1614832069533679617",
    	"md532": "0ed5449e148dfaac16d1247667d62554",
    	"md516": "838026c17d7ac626",
    	"base64": "YmFzZTY0",
    	"aes": "3420e2d91b8f913bb035258e5013cc6f",
    	"rsa": "FqVQIe05Q/usNmZZWA9omCf63WYbhT7z4Qsrpvr+RsWv70vV3hVK5sV1/HZvQL6uI9pU0dkdPDEwIzn0DCJIoVKCW3l7fubdOkjOgaqxv5tIdcLmZFl9XivzA6sDhSIzitFLAj4OJu2HgbF1fNDoVEdYqAD7BEMeNeCyQYyjNQk=",
    	"sm2": "sm2",
    	"sm3": "d0c7f21dc640a69786764d688920d4d968a103a437a6159b9e7cc7c4b826b8ac",
    	"sm4": "sm4",
    	"pbewithmd5anddes": "q30eLvs6615ATdqtscdIpSdZLgC+vg1/+8mLzeD2INo=",
    	"pbewithmd5andtripledes": "PjjKX2OkRE2D/mz3UZLTXXAsLkjuAk6rF8l4WVz/CaE=",
    	"pbewithhmacsha512andaes256": "N5GESK0bGjLsJGO4DadbUMNzPo6ov/svzNHCZg0S4gmrsMLSDMLHDO/6ZrPNsYhpBTR53Xmksi9fxwSU5ScshQ==",
    	"pbewithsha1anddesede": "1kGvVHNUKDbwYG1ZnLhaK2QPre3jFddM3tB6MQETzwE=",
    	"pbewithsha1andrc240": "my9MZrkBSRtwgV6/MjAjwug7HB/lKHTMzmZJeUOrCQY="
    }
    
    注意:数据库存储内容为密文,其中SM2与SM4加密失败,其他算法加密成功

    解密后:
    {
        "id": 1614832069533679617,
        "md532": "0ed5449e148dfaac16d1247667d62554",
        "md516": "838026c17d7ac626",
        "base64": "base64",
        "aes": "aes",
        "rsa": "rsa",
        "sm2": "sm2",
        "sm3": "d0c7f21dc640a69786764d688920d4d968a103a437a6159b9e7cc7c4b826b8ac",
        "sm4": "sm4",
        "pbewithmd5anddes": "pbewithmd5anddes",
        "pbewithmd5andtripledes": "pbewithmd5andtripledes",
        "pbewithhmacsha512andaes256": "pbewithhmacsha512andaes256",
        "pbewithsha1anddesede": "pbewithsha1anddesede",
        "pbewithsha1andrc240": "pbewithsha1andrc240"
    }
    
    注意:调用控制器接口查询数据,查询结果为加密前数据,其中MD5_32 MD5_16 SM3仍是密文,说明这三种算法不可逆

  9. 自定义算法

    注意:自定义加密算法需实现IEncryptor接口,IEncryptor接口可有多个实现类,但只能有一个实现类添加@Component注解,添加
    @Component注解便启用自定义加密算法,一旦启用自定义加密算法,那么项目中所有@FieldEncrypt加密的字段都将使用自定义加密
    算法进行加密,其他算法均不再生效,如下CustomEncryptor自定义加密算法,加密时"##$$##=="+plaintext+"--&&$$&&"实现加密,
    解密时encrypt.replace("##$$##==", "").replace("--&&$$&&", "")实现解密
    // 自定义加密算法,这里为开启使用默认加密库
    @Component
    public class CustomEncryptor implements IEncryptor {
        /**
         * 加密
         *
         * @param algorithm  算法
         * @param password   密码(对称加密算法密钥)
         * @param plaintext  明文
         * @param publicKey  非对称加密算法(公钥)
         * @param metaObject {@link MetaObject}
         * @return
         */
        @Override
        public String encrypt(Algorithm algorithm, String password, String publicKey, String plaintext, Object metaObject) {
            if (metaObject instanceof MetaObject) {
                // _metaObject为加密字段所属对象,可通过已知属性名获取属性值,_metaObject.getValue("属性名")
                MetaObject _metaObject = ((MetaObject) metaObject);
            }
            return "##$$##=="+plaintext+"--&&$$&&";
        }
    
    
        /**
         * 解密
         *
         * @param algorithm  算法
         * @param password   密码(对称加密算法密钥)
         * @param encrypt    密文
         * @param privateKey 非对称加密算法(私钥)
         * @param metaObject {@link MetaObject}
         * @return
         */
        @Override
        public String decrypt(Algorithm algorithm, String password, String privateKey, String encrypt, Object metaObject) {
            if (metaObject instanceof MetaObject) {
                // _metaObject为加密字段所属对象,可通过已知属性名获取属性值,_metaObject.getValue("属性名")
                MetaObject _metaObject = ((MetaObject) metaObject);
            }
            return encrypt.replace("##$$##==", "").replace("--&&$$&&", "");
        }
    }

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

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

相关文章

git commit 命令详解

文章目录前言1. git commit 介绍2. git commit 使用3. git commit -m4. git commit -am5. git commit --amend6. commit 多行提交信息7. commit 背后到底发生了什么前言 CSDN 只用来做博客主站文章的转载 博客主站&#xff1a;https://www.itqaq.com 下面地址路径可能会发生变…

Java---中间件---Redis的常见命令和客户端使用

Redis的常见命令和客户端使用1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启1.4.Redis桌面客…

VulnHub2018_DeRPnStiNK靶机总结

VulnHub2018_DeRPnStiNK靶机渗透总结 靶机下载地址: https://download.vulnhub.com/derpnstink/VulnHub2018_DeRPnStiNK.ova https://www.dropbox.com/s/8jqor3tuc3jhe1w/VulnHub2018_DeRPnStiNK.ova?dl0 打开靶机,使用nmap扫描出靶机的ip和开放的所有端口 可以看到,靶机开放…

从零开始学习Linux

Linux Linux内核版本&#xff1a;Linux内核运维开发小组&#xff0c;源码在不开源 Linux发行版本&#xff1a;由各大互联网/软件公司定制&#xff0c;开源 一个内核版本是有多种多样的发行版本 Ubuntu&#xff1a;以强大的桌面应用为主&#xff0c;吸收不少Windows用户&…

Docker部署jeecgboot微服务使用记录

docker安装和基础命令 docker安装 docker安装详细步骤 Docker命令 #进入容器 sudo docker exec -it 775c7c9ee1e1 /bin/bash # docker中 启动所有的容器命令 docker start $(docker ps -a | awk { print $1} | tail -n 2) # docker中 关闭所有的容器命令 docker stop $(doc…

(黑马C++)L09 C++类型转换 异常 输入输出流

一、C类型转换 类型转换&#xff08;cast&#xff09;是将一种数据类型转换成另一种数据类型&#xff0c;一般情况下要尽量少的去使用类型转换&#xff0c;除非解决非常特殊的问题。 &#xff08;1&#xff09;静态转换&#xff08;static_cast&#xff09; static_cast使用…

联合证券|内外利好共振 今年A股可更乐观一点

在经历了开年首周的快速拉升后&#xff0c;上星期A股商场全体高位盘整。职业板块从普涨转为快速轮动&#xff0c;前期领涨的新能源及大消费主线均出现了必定程度的回撤&#xff0c;由金融、信创板块接力“领跑”。 展望后市&#xff0c;指数在盘整后能否持续上攻&#xff1f;外…

解决前后端分离Vue项目部署到服务器后出现的302重定向问题

解决前后端分离Vue项目部署到服务器后出现的302重定向问题问题描述问题原因定位问题解决方案校验修改效果相关阅读写在最后问题描述 最近发现自己开发的vue前后端分离项目因为使用了spring security 安全框架&#xff0c;即使在登录认证成功之后再调用一些正常的接口总是会莫名…

Xilinx 7系列FPGA之Spartan-7产品简介

以最低的成本获得无与伦比的性能和功耗效率如果您对功耗或性能的要求与成本要求一样严苛&#xff0c;那么请使用 Spartan -7 FPGA。该系列采用 TSMC&#xff08;台积电&#xff09; 的 28nm HPL 工艺制造&#xff0c;将小尺寸架构的Xilinx 7 系列FPGA 的广泛功能和符合 RoHS 标…

结构体专题详解

目录 &#x1f94e;什么是结构体&#xff1f; ⚾结构体的声明 &#x1f3c0;简单结构体的声明 &#x1f3d0;结构体的特殊声明 &#x1f3c8;结构体嵌套问题 &#x1f3c9;结构体的自引用 &#x1f3b3;结构体的内存大小 &#x1f94c;结构体的内存对齐 ⛳内存对齐的优点 ⚽还…

SAP 服务器参数文件详细解析

一、SAP参数的说明 SAP参数的学习需要了解SAP参数的作用、参数的启动顺序、参数的配置&#xff1b; 1、参数的启动顺序 a) 启动Start profileb) 启动default profilec) 启动instance profile 2、参数的位置 a) 启动参数Start profile的位置&#xff1a;/usr/sap//SYS/prof…

计讯物联数字乡村解决方案赋能乡村振兴

项目背景 数字乡村是乡村振兴的战略方向&#xff0c;是推动农村现代化的重要途径。当前&#xff0c;数字乡村建设正在加速推进&#xff0c;打造乡村数字治理新模式&#xff0c;提升乡村的数字化水平&#xff0c;进一步推动乡村振兴进入高质量发展新赛道。计讯物联作为数字乡村…

机器学习的几个公式

今天看了几个公式的推演过程&#xff0c;有些推演过程还不是很明白&#xff0c;再着担心自己后面会忘记&#xff0c;特来此记下笔记。python 是由自己特定的公式符号的&#xff0c;但推演过程需要掌握&#xff0c;其实过程不过程不是重点&#xff0c;只要是要记得公式的含义&am…

SocketCAN 命名空间 VCAN VXCAN CANGW 举例

文章目录NAMESPACESocketCAN最新 can-utils 安装VCAN 举例VXCAN 举例CANGW 举例参考NAMESPACE namespaces, 命名空间, 将全局系统资源包装在抽象中, 使命名空间中的进程看起来拥有自己全局资源的独立实例. 命名空间的一个用途是实现容器. Linux 命名空间类型及隔离物(Isolate…

译文 | Kubernetes 1.26:PodDisruptionBudget 守护不健康 Pod 时所用的驱逐策略

对于 Kubernetes 集群而言&#xff0c;想要确保日常干扰不影响应用的可用性&#xff0c;不是一个简单的任务。上月发布的 Kubernetes v1.26 增加了一个新的特性&#xff1a;允许针对 PodDisruptionBudget (PDB) 指定不健康 Pod 驱逐策略&#xff0c;这有助于在节点执行管理操作…

电商云仓是如何包装发货的?

包装不时是为了维护产品&#xff0c;而它从工厂地板移动到大型仓库&#xff0c;并最终经过批发或批发店抵达消费者。但是&#xff0c;自21世纪初以来&#xff0c;消费者希望与那些不时吸收着某种情感的品牌联络在一同&#xff0c;同时央求他们在心理上对品牌中止投资&#xff0…

【Java AWT 图形界面编程】Canvas 组件中使用 Graphics 绘图 ④ ( AWT 绘图窗口闪烁问题 )

文章目录一、AWT 绘图窗口闪烁问题二、完整代码示例一、AWT 绘图窗口闪烁问题 使用 Graphics 第一次绘图 完成后 , 如果在循环中 持续调用 Canvas#repaint() 函数刷新界面 , 代码如下 : import java.awt.*;public class HelloAWT {public static void main(String[] args) thr…

MySQL进阶——存储引擎

MySQL有9种存储引擎&#xff0c;不同的引擎&#xff0c;适合不同的场景&#xff0c;我们最常用的&#xff0c;可能就是InnoDB&#xff0c;应该是从5.5开始&#xff0c;就成为了MySQL的默认存储引擎。 show engines可以查询MySQL支持的这几种存储引擎&#xff0c;从表头能看出来…

SVN工程转Git工程Github托管

SVN工程转Git工程&Github托管1. 介绍2. autoAudioTest之SVN转Github步骤Step 1 工作环境(ubuntu)Step 2 安装升级必要软件Step 3 转换脚本Step 4 检查软件运行环境Step 5 生成authors.txtStep 6 SVN转换Git格式Step 7 Github新建空工程Step 8 Git提交已有工程Step 9 Git提交…

Dubbo快速入门看这一篇文章就够了

网站用户少,流量小,抗压力差(eg: ssm)网站用户量进一步增长,流量增多,服务器不能平滑扩容(eg: 多个ssm)网站用户和流量随时间稳步升高,需要随时进行服务器扩容(eg: rpc/http) 第2节 分布式框架解决的问题 1 2 3 4 5 6随着互联网架构的越来越复杂,由原来的单一架构 ...到... 流动…