{"id":1673,"date":"2022-01-01T01:32:00","date_gmt":"2021-12-31T17:32:00","guid":{"rendered":"http:\/\/cheng-bing.top\/?p=1673"},"modified":"2022-01-02T13:57:47","modified_gmt":"2022-01-02T05:57:47","slug":"spring%e5%b8%b8%e7%94%a8%e6%96%87%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/cheng-bing.top\/index.php\/2022\/01\/01\/spring%e5%b8%b8%e7%94%a8%e6%96%87%e4%bb%b6\/","title":{"rendered":"Spring\u5e38\u7528\u6587\u4ef6"},"content":{"rendered":"\n<p>RedisConfig:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package org.chengbing.config;\n\nimport com.fasterxml.jackson.annotation.JsonAutoDetect;\nimport com.fasterxml.jackson.annotation.PropertyAccessor;\nimport com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.cache.CacheManager;\nimport org.springframework.cache.annotation.CachingConfigurerSupport;\nimport org.springframework.cache.annotation.EnableCaching;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.data.redis.cache.RedisCacheConfiguration;\nimport org.springframework.data.redis.cache.RedisCacheManager;\nimport org.springframework.data.redis.connection.RedisConnectionFactory;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;\nimport org.springframework.data.redis.serializer.RedisSerializationContext;\nimport org.springframework.data.redis.serializer.RedisSerializer;\nimport org.springframework.data.redis.serializer.StringRedisSerializer;\nimport redis.clients.jedis.JedisPoolConfig;\n\nimport java.time.Duration;\n\n@EnableCaching\n@Configuration\npublic class RedisConfig extends CachingConfigurerSupport {\n    \/**\n     * \u8fde\u63a5\u6c60\u7684\u8bbe\u7f6e\n     *\n     * @return\n     *\/\n    @Bean\n    public JedisPoolConfig getJedisPoolConfig() {\n        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();\n        return jedisPoolConfig;\n    }\n    \/**\n     * RedisTemplate\n     * @param factory\n     * @return\n     *\/\n    @Bean\n    public RedisTemplate&lt;String, Object&gt; redisTemplate(RedisConnectionFactory factory) {\n        RedisTemplate&lt;String, Object&gt; template = new RedisTemplate&lt;&gt;();\n        RedisSerializer&lt;String&gt; redisSerializer = new StringRedisSerializer();\n        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);\n        ObjectMapper om = new ObjectMapper();\n        \/\/ \u6307\u5b9a\u8981\u5e8f\u5217\u5316\u7684\u57df\uff0cfield,get\u548cset,\u4ee5\u53ca\u4fee\u9970\u7b26\u8303\u56f4\uff0cANY\u662f\u90fd\u6709\u5305\u62ecprivate\u548cpublic\n        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n        \/\/ \u6307\u5b9a\u5e8f\u5217\u5316\u8f93\u5165\u7684\u7c7b\u578b\uff0c\u7c7b\u5fc5\u987b\u662f\u975efinal\u4fee\u9970\u7684\uff0cfinal\u4fee\u9970\u7684\u7c7b\uff0c\u6bd4\u5982String,Integer\u7b49\u4f1a\u8dd1\u51fa\u5f02\u5e38\n        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n        jackson2JsonRedisSerializer.setObjectMapper(om);\n        template.setConnectionFactory(factory);\n        \/\/key\u5e8f\u5217\u5316\u65b9\u5f0f\n        template.setKeySerializer(redisSerializer);\n        \/\/value\u5e8f\u5217\u5316\n        template.setValueSerializer(jackson2JsonRedisSerializer);\n        \/\/value hashmap\u5e8f\u5217\u5316\n        template.setHashValueSerializer(jackson2JsonRedisSerializer);\n        return template;\n    }\n    \/**\n     * \u7f13\u5b58\u5904\u7406\n     * @param factory\n     * @return\n     *\/\n    @Bean\n    public CacheManager cacheManager(RedisConnectionFactory factory) {\n        RedisSerializer&lt;String&gt; redisSerializer = new StringRedisSerializer();\n        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);\n        \/\/\u89e3\u51b3\u67e5\u8be2\u7f13\u5b58\u8f6c\u6362\u5f02\u5e38\u7684\u95ee\u9898\n        ObjectMapper om = new ObjectMapper();\n        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);\n        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);\n        jackson2JsonRedisSerializer.setObjectMapper(om);\n        \/\/ \u914d\u7f6e\u5e8f\u5217\u5316\uff08\u89e3\u51b3\u4e71\u7801\u7684\u95ee\u9898\uff09,\u8fc7\u671f\u65f6\u95f4600\u79d2\n        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()\n                .entryTtl(Duration.ofSeconds(600))\n                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))\n                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))\n                .disableCachingNullValues();\n        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)\n                .cacheDefaults(config)\n                .build();\n        return cacheManager;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>GeneratorTest (\u6574\u5408Mybatis-Plus):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;\nimport com.baomidou.mybatisplus.core.toolkit.StringPool;\nimport com.baomidou.mybatisplus.generator.AutoGenerator;\nimport com.baomidou.mybatisplus.generator.InjectionConfig;\nimport com.baomidou.mybatisplus.generator.config.*;\nimport com.baomidou.mybatisplus.generator.config.po.TableInfo;\nimport com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;\nimport org.apache.commons.lang3.StringUtils;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Scanner;\n\n\/**\n * @author yuyongli\n * @Date 2021\/5\/29\n *\/\npublic class GeneratorTest {\n    \/**\n     * &lt;p&gt;\n     * \u8bfb\u53d6\u63a7\u5236\u53f0\u5185\u5bb9\n     * &lt;\/p&gt;\n     *\/\n    public static String scanner(String tip) {\n        Scanner scanner = new Scanner(System.in);\n        StringBuilder help = new StringBuilder();\n        help.append(\"\u8bf7\u8f93\u5165\" + tip + \"\uff1a\");\n        System.out.println(help.toString());\n        if (scanner.hasNext()) {\n            String ipt = scanner.next();\n            if (StringUtils.isNotBlank(ipt)) {\n                return ipt;\n            }\n        }\n        throw new MybatisPlusException(\"\u8bf7\u8f93\u5165\u6b63\u786e\u7684\" + tip + \"\uff01\");\n    }\n    public static void main(String&#91;] args) {\n        \/\/ \u4ee3\u7801\u751f\u6210\u5668\n        AutoGenerator mpg = new AutoGenerator();\n        \/\/ \u5168\u5c40\u914d\u7f6e\n        GlobalConfig gc = new GlobalConfig();\n        String projectPath = System.getProperty(\"user.dir\")+ File.separator+\"\";\/\/\n        gc.setOutputDir(projectPath + \"\/src\/main\/java\");\n        gc.setAuthor(\"HaroldCI\");\n        gc.setOpen(false);\n        gc.setSwagger2(true); \/\/\u5b9e\u4f53\u5c5e\u6027 Swagger2 \u6ce8\u89e3\n        mpg.setGlobalConfig(gc);\n        \/\/ \u6570\u636e\u6e90\u914d\u7f6e\n        DataSourceConfig dsc = new DataSourceConfig();\n        dsc.setUrl(\"jdbc:mysql:\/\/localhost:3306\/cbrmarketplatform?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;allowPublicKeyRetrieval=true\");\n        \/\/ dsc.setSchemaName(\"public\");\n        dsc.setDriverName(\"com.mysql.jdbc.Driver\");\n        dsc.setUsername(\"root\");\n        dsc.setPassword(\"root\");\n        mpg.setDataSource(dsc);\n        \/\/ \u5305\u914d\u7f6e\n        PackageConfig pc = new PackageConfig();\n        \/\/pc.setModuleName(scanner(\"\u6a21\u5757\u540d\"));\n        pc.setParent(\"org.chengbing\");\n        \/\/pc.setXml(\"\");\n        pc.setEntity(\"entity\");\/\/\u5b9e\u4f53\u7684\u5305\n        pc.setMapper(\"dao\");\/\/dao\u7684\u5305\n        pc.setService(\"service\");\/\/service\u7684\u5305\n        pc.setServiceImpl(\"service.impl\");\/\/\u5b9e\u73b0\u7c7b\u7684\u5305\n        mpg.setPackageInfo(pc);\n        \/\/ \u81ea\u5b9a\u4e49\u914d\u7f6e\n        InjectionConfig cfg = new InjectionConfig() {\n            @Override\n            public void initMap() {\n                \/\/ to do nothing\n            }\n        };\n        \/\/ \u5982\u679c\u6a21\u677f\u5f15\u64ce\u662f freemarker\n        \/\/ String templatePath = \"\/templates\/mapper.xml.ftl\";\n        \/\/ \u5982\u679c\u6a21\u677f\u5f15\u64ce\u662f velocity\n        String templatePath = \"\/templates\/mapper.xml.vm\";\n        \/\/ \u81ea\u5b9a\u4e49\u8f93\u51fa\u914d\u7f6e\n        List&lt;FileOutConfig&gt; focList = new ArrayList&lt;&gt;();\n        \/\/ \u81ea\u5b9a\u4e49\u914d\u7f6e\u4f1a\u88ab\u4f18\u5148\u8f93\u51fa\n        focList.add(new FileOutConfig(templatePath) {\n            @Override\n            public String outputFile(TableInfo tableInfo) {\n                \/\/ \u81ea\u5b9a\u4e49\u8f93\u51fa\u6587\u4ef6\u540d \uff0c \u5982\u679c\u4f60 Entity \u8bbe\u7f6e\u4e86\u524d\u540e\u7f00\u3001\u6b64\u5904\u6ce8\u610f xml \u7684\u540d\u79f0\u4f1a\u8ddf\u7740\u53d1\u751f\u53d8\u5316\uff01\uff01\n                return projectPath + \"\/src\/main\/resources\/mapper\/\"  + tableInfo.getEntityName() + \"Mapper\" + StringPool.DOT_XML;\n            }\n        });\n        cfg.setFileOutConfigList(focList);\n        mpg.setCfg(cfg);\n        \/\/ \u914d\u7f6e\u6a21\u677f\n        \/\/\u4e0d\u5728java\u6587\u4ef6\u5939\u4e0b\u9762\u5199\u5165mapper\u6587\u4ef6\n        TemplateConfig templateConfig = new TemplateConfig();\n        templateConfig.setXml(null);\n        mpg.setTemplate(templateConfig);\n        \/\/ \u7b56\u7565\u914d\u7f6e\n        StrategyConfig strategy = new StrategyConfig();\n        strategy.setNaming(NamingStrategy.underline_to_camel);\n        strategy.setColumnNaming(NamingStrategy.underline_to_camel);\n        strategy.setEntityLombokModel(true);\n        strategy.setRestControllerStyle(true);\n        \/\/ \u516c\u5171\u7236\u7c7b\n        \/\/ \u5199\u4e8e\u7236\u7c7b\u4e2d\u7684\u516c\u5171\u5b57\u6bb5\n        \/\/ strategy.setSuperEntityColumns(\"id\");\n        \/\/strategy.setInclude(scanner(\"\u8868\u540d\uff0c\u591a\u4e2a\u82f1\u6587\u9017\u53f7\u5206\u5272\").split(\",\"));\n        strategy.setControllerMappingHyphenStyle(true);\n        strategy.setTablePrefix(pc.getModuleName() + \"_\");\n        mpg.setStrategy(strategy);\n        mpg.execute();\n    }\n}\n\n <\/code><\/pre>\n\n\n\n<p>pom.xml:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5546\u4e1a\u8f6c\u8f7d\u8bf7\u8054\u7cfb\u4f5c\u8005\u83b7\u5f97\u6388\u6743\uff0c\u975e\u5546\u4e1a\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u51fa\u5904\u3002\n# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.\n# \u534f\u8bae(License)\uff1a\u7f72\u540d-\u975e\u5546\u4e1a\u6027\u4f7f\u7528-\u76f8\u540c\u65b9\u5f0f\u5171\u4eab 4.0 \u56fd\u9645 (CC BY-NC-SA 4.0)\n# \u4f5c\u8005(Author)\uff1aHarold\n# \u94fe\u63a5(URL)\uff1ahttp:\/\/cheng-bing.top\/index.php\/2022\/01\/01\/spring%e9%a1%b9%e7%9b%ae%e5%b8%b8%e7%94%a8dependencies\/\n# \u6765\u6e90(Source)\uff1aChengbing Republic Embassy\n\n&lt;dependencies&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-data-redis&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- MySQL --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;mysql&lt;\/groupId&gt;\n        &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n        &lt;scope&gt;runtime&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-tomcat&lt;\/artifactId&gt;\n        &lt;scope&gt;provided&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n        &lt;scope&gt;test&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- Redis --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;redis.clients&lt;\/groupId&gt;\n        &lt;artifactId&gt;jedis&lt;\/artifactId&gt;\n        &lt;version&gt;3.2.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.apache.commons&lt;\/groupId&gt;\n        &lt;artifactId&gt;commons-pool2&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- JUnit --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;junit&lt;\/groupId&gt;\n        &lt;artifactId&gt;junit&lt;\/artifactId&gt;\n        &lt;version&gt;4.10&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- \u8fde\u63a5\u6c60 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n        &lt;artifactId&gt;druid&lt;\/artifactId&gt;\n        &lt;version&gt;1.1.6&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;log4j&lt;\/groupId&gt;\n        &lt;artifactId&gt;log4j&lt;\/artifactId&gt;\n        &lt;version&gt;1.2.17&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- \u4e0a\u4f20\u6587\u4ef6 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;commons-fileupload&lt;\/groupId&gt;\n        &lt;artifactId&gt;commons-fileupload&lt;\/artifactId&gt;\n        &lt;version&gt;1.3.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;commons-io&lt;\/groupId&gt;\n        &lt;artifactId&gt;commons-io&lt;\/artifactId&gt;\n        &lt;version&gt;2.6&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- Encryption --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;commons-codec&lt;\/groupId&gt;\n        &lt;artifactId&gt;commons-codec&lt;\/artifactId&gt;\n        &lt;version&gt;1.14&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.bouncycastle&lt;\/groupId&gt;\n        &lt;artifactId&gt;bcprov-jdk15on&lt;\/artifactId&gt;\n        &lt;version&gt;1.56&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.slf4j&lt;\/groupId&gt;\n        &lt;artifactId&gt;slf4j-log4j12&lt;\/artifactId&gt;\n        &lt;version&gt;1.7.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- JSON --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n        &lt;artifactId&gt;fastjson&lt;\/artifactId&gt;\n        &lt;version&gt;1.2.28&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n        &lt;artifactId&gt;jackson-databind&lt;\/artifactId&gt;\n        &lt;version&gt;2.10.2&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n        &lt;artifactId&gt;jackson-core&lt;\/artifactId&gt;\n        &lt;version&gt;2.10.2&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n        &lt;artifactId&gt;jackson-annotations&lt;\/artifactId&gt;\n        &lt;version&gt;2.10.2&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Swagger2 note --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;io.springfox&lt;\/groupId&gt;\n        &lt;artifactId&gt;springfox-swagger2&lt;\/artifactId&gt;\n        &lt;version&gt;2.4.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;!-- Lombok --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n        &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!--mybatis-plus--&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.baomidou&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-plus-boot-starter&lt;\/artifactId&gt;\n        &lt;version&gt;3.4.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.baomidou&lt;\/groupId&gt;\n        &lt;artifactId&gt;mybatis-plus-generator&lt;\/artifactId&gt;\n        &lt;version&gt;3.4.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.apache.velocity&lt;\/groupId&gt;\n        &lt;artifactId&gt;velocity-engine-core&lt;\/artifactId&gt;\n        &lt;version&gt;2.2&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- \u8ba4\u8bc1 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;cn.dev33&lt;\/groupId&gt;\n        &lt;artifactId&gt;sa-token-spring-boot-starter&lt;\/artifactId&gt;\n        &lt;version&gt;1.28.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/code><\/pre>\n\n\n\n<p>AESUtils (copyright@GuanHua Wang):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package org.chengbing.util;\n\nimport org.apache.commons.codec.binary.Base64;\nimport org.bouncycastle.jce.provider.BouncyCastleProvider;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport javax.crypto.Cipher;\nimport javax.crypto.KeyGenerator;\nimport javax.crypto.SecretKey;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.security.Provider;\nimport java.security.SecureRandom;\nimport java.security.Security;\n\n\/**\n * @author GuanHua Wang\n * @ClassName: AESUtils\n * @Description: aes\u5bf9\u79f0\u52a0\u5bc6\u89e3\u5bc6\u5de5\u5177\u7c7b, \u6ce8\u610f\u5bc6\u94a5\u4e0d\u80fd\u968f\u673a\u751f\u673a, \u4e0d\u540c\u5ba2\u6237\u7aef\u8c03\u7528\u53ef\u80fd\u9700\u8981\u8003\u8651\u4e0d\u540cProvider,\n * \u8003\u8651\u5b89\u5353\u4e0eIOS\u4e0d\u540c\u5e73\u53f0\u590d\u6742\u5ea6,\u7b80\u5316\u4e0d\u4f7f\u7528Provider\n * @date 2019\u5e741\u670815\u65e516:00:39\n *\/\npublic class AESUtils {\n\n    \/***\u9ed8\u8ba4\u5411\u91cf\u5e38\u91cf**\/\n    public static final String IV = \"1234567890123456\";\n    private final static Logger logger = LoggerFactory.getLogger(AESUtils.class);\n\n    \/**\n     * \u4f7f\u7528PKCS7Padding\u586b\u5145\u5fc5\u987b\u6dfb\u52a0\u4e00\u4e2a\u652f\u6301PKCS7Padding\u7684Provider\n     * \u7c7b\u52a0\u8f7d\u7684\u65f6\u5019\u5c31\u5224\u65ad\u662f\u5426\u5df2\u7ecf\u6709\u652f\u6301256\u4f4d\u7684Provider,\u5982\u679c\u6ca1\u6709\u5219\u6dfb\u52a0\u8fdb\u53bb\n     *\/\n    static {\n        if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {\n            Security.addProvider(new BouncyCastleProvider());\n        }\n    }\n\n    \/**\n     * \u52a0\u5bc6 128\u4f4d\n     *\n     * @param content \u9700\u8981\u52a0\u5bc6\u7684\u539f\u5185\u5bb9\n     * @param pkey    \u5bc6\u5319\n     * @return\n     *\/\n    public static byte&#91;] aesEncrypt(String content, String pkey) {\n        try {\n            \/\/SecretKey secretKey = generateKey(pkey);\n            \/\/byte&#91;] enCodeFormat = secretKey.getEncoded();\n            SecretKeySpec skey = new SecretKeySpec(pkey.getBytes(), \"AES\");\n            Cipher cipher = Cipher.getInstance(\"AES\/CBC\/PKCS7Padding\");\/\/ \"\u7b97\u6cd5\/\u52a0\u5bc6\/\u586b\u5145\"\n            IvParameterSpec iv = new IvParameterSpec(IV.getBytes());\n            cipher.init(Cipher.ENCRYPT_MODE, skey, iv);\/\/\u521d\u59cb\u5316\u52a0\u5bc6\u5668\n            byte&#91;] encrypted = cipher.doFinal(content.getBytes(\"UTF-8\"));\n            return encrypted; \/\/ \u52a0\u5bc6\n        } catch (Exception e) {\n            logger.info(\"aesEncrypt() method error:\", e);\n        }\n        return null;\n    }\n\n    \/**\n     * \u83b7\u5f97\u5bc6\u94a5\n     *\n     * @param secretKey\n     * @return\n     * @throws Exception\n     *\/\n    private static SecretKey generateKey(String secretKey) throws Exception {\n        \/\/\u9632\u6b62linux\u4e0b \u968f\u673a\u751f\u6210key\n        Provider p = Security.getProvider(\"SUN\");\n        SecureRandom secureRandom = SecureRandom.getInstance(\"SHA1PRNG\", p);\n        secureRandom.setSeed(secretKey.getBytes());\n        KeyGenerator kg = KeyGenerator.getInstance(\"AES\");\n        kg.init(secureRandom);\n        \/\/ \u751f\u6210\u5bc6\u94a5\n        return kg.generateKey();\n    }\n\n    \/**\n     * @param content \u52a0\u5bc6\u524d\u539f\u5185\u5bb9\n     * @param pkey    \u957f\u5ea6\u4e3a16\u4e2a\u5b57\u7b26,128\u4f4d\n     * @return base64EncodeStr   aes\u52a0\u5bc6\u5b8c\u6210\u540e\u5185\u5bb9\n     * @throws\n     * @Title: aesEncryptStr\n     * @Description: aes\u5bf9\u79f0\u52a0\u5bc6\n     *\/\n    public static String aesEncryptStr(String content, String pkey) {\n        byte&#91;] aesEncrypt = aesEncrypt(content, pkey);\n        \/\/ System.out.println(\"\u52a0\u5bc6\u540e\u7684byte\u6570\u7ec4:\" + Arrays.toString(aesEncrypt));\n        String base64EncodeStr = Base64.encodeBase64String(aesEncrypt);\n        \/\/ System.out.println(\"\u52a0\u5bc6\u540e base64EncodeStr:\" + base64EncodeStr);\n        return base64EncodeStr;\n    }\n\n    \/**\n     * @param content base64\u5904\u7406\u8fc7\u7684\u5b57\u7b26\u4e32\n     * @param pkey    \u5bc6\u5319\n     * @return String    \u8fd4\u56de\u7c7b\u578b\n     * @throws Exception\n     * @throws\n     * @Title: aesDecodeStr\n     * @Description: \u89e3\u5bc6 \u5931\u8d25\u5c06\u8fd4\u56deNULL\n     *\/\n    public static String aesDecodeStr(String content, String pkey) throws Exception {\n        try {\n            \/\/System.out.println(\"\u5f85\u89e3\u5bc6\u5185\u5bb9:\" + content);\n            byte&#91;] base64DecodeStr = Base64.decodeBase64(content);\n            \/\/System.out.println(\"base64DecodeStr:\" + Arrays.toString(base64DecodeStr));\n            byte&#91;] aesDecode = aesDecode(base64DecodeStr, pkey);\n            \/\/System.out.println(\"aesDecode:\" + Arrays.toString(aesDecode));\n            if (aesDecode == null) {\n                return null;\n            }\n            String result;\n            result = new String(aesDecode, \"UTF-8\");\n            \/\/System.out.println(\"aesDecode result:\" + result);\n            return result;\n        } catch (Exception e) {\n            System.out.println(\"Exception:\" + e.getMessage());\n            throw new Exception(\"\u89e3\u5bc6\u5f02\u5e38\");\n        }\n    }\n\n    \/**\n     * \u89e3\u5bc6 128\u4f4d\n     *\n     * @param content \u89e3\u5bc6\u524d\u7684byte\u6570\u7ec4\n     * @param pkey    \u5bc6\u5319\n     * @return result  \u89e3\u5bc6\u540e\u7684byte\u6570\u7ec4\n     * @throws Exception\n     *\/\n    public static byte&#91;] aesDecode(byte&#91;] content, String pkey) throws Exception {\n\n        \/\/SecretKey secretKey = generateKey(pkey);\n        \/\/byte&#91;] enCodeFormat = secretKey.getEncoded();\n        SecretKeySpec skey = new SecretKeySpec(pkey.getBytes(), \"AES\");\n        IvParameterSpec iv = new IvParameterSpec(IV.getBytes(\"UTF-8\"));\n        Cipher cipher = Cipher.getInstance(\"AES\/CBC\/PKCS7Padding\");\/\/ \u521b\u5efa\u5bc6\u7801\u5668\n        cipher.init(Cipher.DECRYPT_MODE, skey, iv);\/\/ \u521d\u59cb\u5316\u89e3\u5bc6\u5668\n        byte&#91;] result = cipher.doFinal(content);\n        return result; \/\/ \u89e3\u5bc6\n\n    }\n\n    public static String getPkey()\n    {\n        return \"ifyoucanhearthisvoice,youarealon\";\n    }\n\n\n    public static void main(String&#91;] args) throws Exception {\n        \/\/\u660e\u6587\n        \/\/ String content = HaroldFile.readFile(\"resource.txt\");\n        String content = \"DLMDX720110\";\n        \/\/\u5bc6\u5319\n        String pkey2 = \"ifyoucanhearthisvoice,youarealon\";\n\n        \/\/ Encrypted\n        String encryptedText = \"CSDV08YGcBVAKNQh2DmHcg==\";\n        System.out.println(aesDecodeStr(encryptedText, pkey2));\n\n        \/*System.out.println(\"\u5f85\u52a0\u5bc6\u62a5\u6587:\" + content);\n        System.out.println(\"\u5bc6\u5319:\" + pkey2);\n        String aesEncryptStr = aesEncryptStr(content, pkey2);\n        System.out.println(\"\u52a0\u5bc6\u62a5\u6587:\" + aesEncryptStr);\n        String aesDecodeStr = aesDecodeStr(aesEncryptStr, pkey2);\n        System.out.println(\"\u89e3\u5bc6\u62a5\u6587:\" + aesDecodeStr);\n        System.out.println(\"\u52a0\u89e3\u5bc6\u524d\u540e\u5185\u5bb9\u662f\u5426\u76f8\u7b49:\" + aesDecodeStr.equals(content));*\/\n    }\n\n}<\/code><\/pre>\n\n\n\n<p>Druid.properties:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>driverClassName=com.mysql.jdbc.Driver\n# url=jdbc:mysql:\/\/localhost:3306\/qinlin_exchange?serverTimezone=Asia\/Shanghai\nurl=jdbc:mysql:\/\/localhost:3306\/xxxx?serverTimezone=Asia\/Shanghai\n# username=qinlin_exchange\nusername = root\npassword=root\ninitialSize=5\nmaxActive=50\nmaxWait=3000<\/code><\/pre>\n\n\n\n<p>application.properties:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>server.port=8082\nspring.application.name=cbrMarketPlatform\n\nspring.jackson.date-format=yyyy-MM-dd HH:mm:ss\nspring.jackson.time-zone=GMT+8\n\nspring.datasource.type=com.alibaba.druid.pool.DruidDataSource\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\nspring.datasource.url=jdbc:mysql:\/\/127.0.0.1:3306\/cbrmarketplatform?serverTimezone=Asia\/Shanghai\nspring.datasource.username=root\nspring.datasource.password=root\n\nspring.servlet.multipart.max-file-size=5MB\nspring.servlet.multipart.max-request-size=5MB\n\n\n# Redis Database Index\nspring.redis.database=15\n# Redis Pass\nspring.redis.password=harold\n# Redis Host\nspring.redis.host=192.168.129.131\nspring.redis.port=6379\nspring.redis.timeout=1800000\nspring.redis.lettuce.pool.max-active=20\nspring.redis.lettuce.pool.max-wait=-1\nspring.redis.lettuce.pool.max-idle=5\nspring.redis.lettuce.pool.min-idle=0\n<\/code><\/pre>\n\n\n\n<p>SecKillController:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package org.chengbing.other;\n\nimport org.springframework.dao.DataAccessException;\nimport org.springframework.data.redis.core.RedisOperations;\nimport org.springframework.data.redis.core.RedisTemplate;\nimport org.springframework.data.redis.core.SessionCallback;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\nimport redis.clients.jedis.Jedis;\nimport redis.clients.jedis.Transaction;\n\nimport javax.annotation.Resource;\nimport java.util.List;\nimport java.util.UUID;\n\n@RestController\npublic class SecKillController {\n    @Resource\n    RedisTemplate redisTemplate;\n    @GetMapping(\"seckill\")\n    public void secKill()\n    {\n        String uid = \"CryoWolf\" + \":\" + UUID.randomUUID();\n        Jedis jedis = new Jedis(\"192.168.129.131\", 6379);\n        jedis.select(15);\n\n        String storageKey = \"storage:1\";\n        jedis.watch(storageKey);\n        String s = jedis.get(storageKey);\n        if(s == null) {\n            System.out.println(\"The SecKill has not started yet! Thanks for your patient!\");\n            return;\n        }\n        \/\/ if less or equal to zero : end\n\n        int num = Integer.parseInt(s);\n        if(num &lt;= 0) {\n            System.out.println(\"Already Ended.\");\n            return;\n        }\n\n        \/\/ If the storage is greater than zero : secKill\n        \/\/ Succeed: storage -1, record the user information using set\n        Boolean userKey = jedis.sismember(\"userkey\", uid);\n        if(userKey) {\n            System.out.println(\"Already Operated\");\n            return;\n        }else {\n            Transaction multi = jedis.multi();\n            multi.decr(storageKey);\n            multi.sadd(\"userkey\", uid);\n            List&lt;Object&gt; exec = multi.exec();\n            if(exec == null || exec.size() == 0)\n            {\n                System.out.println(\"The Operation Failed.\");\n                return;\n            }else\n            {\n                System.out.println(\"Succeed! The User Id is \"+uid);\n            }\n        }\n\n    }\n\n    @GetMapping(\"seckill2\")\n    public void secKill2() {\n        String uid = \"CryoWolf_\" + UUID.randomUUID();\n            SessionCallback sessionCallback = new SessionCallback() {\n                @Override\n                public Object execute(RedisOperations redisOperations) throws DataAccessException {\n                    redisTemplate.setEnableTransactionSupport(true);\n                    redisTemplate.watch(\"storage:1\");\n                    Integer storage = (Integer) redisTemplate.opsForValue().get(\"storage:1\");\n                    if(storage == null) {\n                        System.out.println(\"Hasn't been started yet\");\n                        return null;\n                    }\n                    if(storage &lt;= 0) {\n                        System.out.println(\"Empty Storage, Event Ended\");\n                        return null;\n                    }\n                    Boolean isMem = redisTemplate.opsForSet().isMember(\"userkey\", uid);\n                    if(isMem) {\n                        System.out.println(\"Already Purchased\");\n                        return null;\n                    }\n                    redisOperations.multi();\n                    redisOperations.opsForValue().decrement(\"storage:1\");\n                    redisOperations.opsForSet().add(\"userkey\", uid);\n                    List exec = redisOperations.exec();\n                    return exec;\n                }\n            };\n            List execute = (List) redisTemplate.execute(sessionCallback);\n            if(execute == null || execute.size() == 0)\n            {\n                System.out.println(\"The Operation Failed.\");\n                return;\n            }else\n            {\n                System.out.println(\"Succeed! The User Id is \"+uid);\n            }\n\n\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\u8bb0\u5f97\u52a0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@ComponentScan(\"org.chengbing.dao\")<\/code><\/pre>\n\n\n\n<p>CorsConfig:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package org.chengbing.config;\r\n\r\nimport java.io.IOException;\r\nimport javax.servlet.Filter;\r\nimport javax.servlet.FilterChain;\r\nimport javax.servlet.FilterConfig;\r\nimport javax.servlet.ServletException;\r\nimport javax.servlet.ServletRequest;\r\nimport javax.servlet.ServletResponse;\r\nimport javax.servlet.http.HttpServletRequest;\r\nimport javax.servlet.http.HttpServletResponse;\r\n\r\nimport org.springframework.stereotype.Component;\r\n\r\n@Component\r\npublic class CorsFilter implements Filter {\r\n    @Override\r\n    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {\r\n        HttpServletRequest request = (HttpServletRequest) req;\r\n        HttpServletResponse response = (HttpServletResponse) res;\r\n        response.setHeader(\"Access-Control-Allow-Origin\", \"*\");\r\n        response.setHeader(\"Access-Control-Allow-Methods\", \"POST, GET, OPTIONS, DELETE, PUT, GET\");\r\n        response.setHeader(\"Access-Control-Max-Age\", \"3600\");\r\n        response.setHeader(\"Access-Control-Allow-Headers\", \"x-requested-with\");\r\n        chain.doFilter(req, res);\r\n    }\r\n    @Override\r\n    public void init(FilterConfig filterConfig) {}\r\n\r\n    @Override\r\n    public void destroy() {}\r\n}<\/code><\/pre>\n\n\n\n<p>MybatisPlus Config<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package org.chengbing.config;\r\n\r\nimport com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;\r\nimport com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;\r\nimport com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;\r\nimport org.springframework.context.annotation.Bean;\r\nimport org.springframework.context.annotation.Configuration;\r\n\/**\r\n * @Author: fun\r\n * @Description: \u5206\u9875\u62e6\u622a\u5668\r\n * @Date: 2020\/9\/10 10:26\r\n * @Version: 1.0.0\r\n *\/@Configuration\r\npublic class MybatisPlusConfig {\r\n    \/**\r\n     * \u6ce8\u5165\u4e3b\u952e\u751f\u6210\u5668 *\/ @Bean\r\n    public IKeyGenerator keyGenerator() {\r\n        return new H2KeyGenerator();\r\n    }\r\n    \/**\r\n     * \u5206\u9875\u63d2\u4ef6 *\/ @Bean\r\n    public PaginationInterceptor paginationInterceptor() {\r\n        return new PaginationInterceptor();\r\n    }\r\n}<\/code><\/pre>\n\n\n\n<p>Mybatis Plus Pagination:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Page&lt;Region> pageRegion = new Page&lt;>(page + 1, rowsPerPage);\r\n        IPage&lt;Region> regions = service.selectUserPage(pageRegion);\r\n        Integer totalPage = Math.toIntExact(regions.getPages());\r\n        return new ResultWithInfo&lt;>(regions.getRecords(), 200, totalPage);<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>RedisConfig: GeneratorTest (\u6574\u5408Mybatis-Plus): pom.xml: AESUtils (c &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/posts\/1673"}],"collection":[{"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/comments?post=1673"}],"version-history":[{"count":4,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/posts\/1673\/revisions"}],"predecessor-version":[{"id":1685,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/posts\/1673\/revisions\/1685"}],"wp:attachment":[{"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/media?parent=1673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/categories?post=1673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cheng-bing.top\/index.php\/wp-json\/wp\/v2\/tags?post=1673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}