头像

java实现替换json字符串参数值

以下是代码:

String str="{\"code\":\"na7ne\",\"identity\":1671760031645,\"password\":\"88888888\",\"username\":\"fuj\"}";
JSONObject jsonObject = JSON.parseObject(str);
System.out.println(str);
for(Map.Entry<String,Object> map: jsonObject.entrySet()){
    if(map.getKey().contains("password"))
        JSONPath.set(jsonObject,"$."+map.getKey(),"***");
}
System.out.println(jsonObject.toJSONString());

以下是输出内容:

{"code":"na7ne","identity":1671760031645,"password":"88888888","username":"fuj"}
{"password":"***","code":"na7ne","identity":1671760031645,"username":"fuj"}
头像

MYBATIS-PLUS 多数据源-读写分离

前言

最近翻了下mybatis-plus官方文档,发现多数据源这一块,提供了读写分离的功能。之前系统使用的sharding sphere插件实现读写分离(没有使用分库分表,业务上不去),总结有以下缺陷:
1、单纯使用读写分离,也受到SQL不支持项的约束
2、项目启动时,加载meta数据时间比较长(200+的表,本地开发加载12000+ms,测试环境4000+ms)
3、打印的sql执行日志,换行比较多,也不像mybatis打印的SQL那么容易还原(或者直接通过插件还原)
既然mybatis-plus提供了读写分离功能,系统中本来也集成了mybatis-plus,于是决定改用mybatis-plus提供读写分离。

PS:自己也找过很多方式尝试,失败了!!!

过程

官网地址

mbatis-plus
mybatis-plus 多数据源

过程

按照官网指引

引入DYNAMIC-DATASOURCE-SPRING-BOOT-STARTER

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>

配置数据源,使用HIKARI连接池

spring:
  datasource:    
    dynamic:
      p6spy: false
      hikari:
        connection-test-query: SELECT 1
        minimum-idle: 60
        idle-timeout: 30000
        maximum-pool-size: 500
        auto-commit: true
        max-lifetime: 120000
        connection-timeout: 30000
      primary: master
      strict: false
      datasource:
        master:
          url: jdbc:mysql://xxx:3306/xxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: masterHikariPool
        slave_1:
          url: jdbc:mysql://xxxx:3308/xxxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
          username: xxx
          password: xxxx
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.zaxxer.hikari.HikariDataSource
          hikari:
            pool-name: slave1HikariPool

注意,在官网的示例里,默认是使用druid连接池,要修改为hikari,必须指定type:com.zaxxer.hikari.HikariDataSource,不然都是使用druid,而且该starter使用的druid版本,还是会有localDateTime转换出错的问题

使用读写分离模式

    @Bean
    public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){
        return new MasterSlaveAutoRoutingPlugin();
    }

开启日志打印

logging:
  level:
  	com.baomidou.dynamic: debug

注意,这个是全局配置,可以不用@DS注解在每个类上,当然也可以注解,注解了@DS,则按照@DS注解进行

 

网址来源:https://www.freesion.com/article/65781031315/

头像

[postgresql] – 重复数据删除,仅保留其中一条

1.常规删除方法
explain analyse delete from deltest a where a.ctid <> (select min(t.ctid) from deltest t where a.id=t.id);
2.group by删除方法
explain analyse delete from deltest a where a.ctid not in (select min(ctid) from deltest group by id);
3.row_number删除方法
explain analyze delete from deltest a where a.ctid = any(array (select ctid from (select row_number() over (partition by id), ctid from deltest) t where t.row_number > 1));

根据某个字段分组删除重复数据,只保留日期最大的一条,建议使用窗口函数效率更高

头像

.Net 中Json序列化实体时忽略部分属性

接口对接中,返回的实体想要部分字段不被序列化返回。以前的做法是新建一个类做深拷贝,后来发现这方法不是很友好。

找了个不错的方法如下:

using Newtonsoft.Json;
namespace Actuator.Contacts
{
[JsonObject(MemberSerialization.OptIn)]
class ZJ
{
[JsonProperty]
public string seqid; //Varchar(50) 每条记录的时间戳标识,精确到毫秒
[JsonProperty]
public string code; //Varchar(200)设备号(终端 SN 号)
[JsonProperty]
public string pileCode;// Varchar(50) 桩编号由施工现场定义,一般为桩号

[JsonProperty]
public int isResultData = 1; // Int 是否为施工结果数据 1是,0否

[JsonIgnoreAttribute]
public int KeyId { get; set; }

}
}

附带解释
JsonObjectAttribute
这个标签的成员序列化标志指定成员序列化是opt-in(要序列化的成员必须带有JsonProperty或DataMember标签)还是opt-out(默认所有的都会序列化,但通过JsonIgnoreAttribute标签可以忽略序列化。opt-out是json.net默认的)。

JsonPropertyAttribute
允许被序列化的成员自定义名字。这个标签同时标示出:在成员序列化设置为opt-in的时候,成员会被序列化。

JsonIgnoreAttribute
忽略域或属性的序列化

JsonConverterAttribute
用于指派转换对象的JsonSerializer。
这个标签可以修饰类或类成员。用于修饰类时,通过此标签指派的JsonConverter会被设置为序列化类的默认方式。用于修饰属性或域成员时,被指派的JsonConverter会序列化它们的值

[XmlIgnore]
忽略xml 序列化

头像

Postgres数据库忘记密码,只需三个步骤重置

Postgres数据库忘记密码,三个步骤解决
一、修改data目录下的 pg_hba.conf 文件
将以下这行
host    all            all           127.0.0.1/32          md5
改为如下:
host    all            all           127.0.0.1/32          trust
如果开启ipv6的话,以下也要修改
# IPv6 local connections:
host all all ::1/128 trust
二、运行cmd,进入postgres安装路径的bin目录,运行如下命令:
psql -U postgres
postgres=# alter user postgres with password ‘你要设置的密码';
postgres=# \q 
三、修改data目录下的 pg_hba.conf 文件
将以下这行

host  all   all  127.0.0.1/32  trust
改为如下:
host  all   all  127.0.0.1/32  md5
ipv6的密码方式也修改
重新启动postgres
头像

OpenSSL生成私钥和公钥

1.生成私钥

— 生成 RSA 私钥(传统格式的)

openssl genrsa -out rsa_private_key.pem 1024

— 将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使用的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过)

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

2.生成公钥

— 生成 RSA 公钥(php和java都用转换前私钥生成公钥)

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

3.OpenSSL私钥生成签名

//获取私钥资源
$re = openssl_get_privatekey($privateKeyFilePath);
//生成签名
openssl_sign($data, $sign, $re);
//base64_encode防止乱码
$sign = base64_encode($sign);

4.OpenSSL公钥验签

$re = openssl_get_publickey($publicKeyFilePath);
$result = openssl_verify($data, $sign, $re);
头像

阿里云VPN+深信服SDW-R搭建

购买阿里云VPN部署

一、阿里云配置

1、创建VPN用户网关

ip地址填写本地服务器静态ip。

2、创建IPsec链接

选择对应的vpn网关、用户网关。

路由模式,我是选择路由模式

设置预共享密钥

高级设置,这里基本采用默认选项即可

3、VPN网关路由表

我这里使用的是目的路由表

如目标网段为:本地ip 192.168.88.94/32  (ip/32 这种用法,这里不做解释)

下一跳类型选择IPsec连接

下一跳选择建立好的IPsec连接

添加发布。

 

二、深信服配置,以我的版本为例,其它应该差不多,主要操作VPN

1、基本设置,添加IPsec VPN线路

2、进入第三方对接管理,点击新增第三方设备,填写对应信息。如下图:

 

20210429181554-vpn

IKE配置

20210429181758-vpn2

IPsec配置,使用默认就行了。

可以通过查看系统日志分析,在深信服vpn首页查看链接状态。

 

以上就配置完成,然后本地就可以访问服务器的内网ip了。