自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

聚沙成塔

Just Keep Coding -- https://github.com/zc-zangchao/

  • 博客(284)
  • 收藏
  • 关注

原创 Java Web知识总结汇总

Java Web基础篇Java Web基础篇之Java多线程Java Web基础篇之Java集合类Java Web基础篇之Java I/OJava Web基础篇之Java基础Java Web基础篇之漫谈Java锁Java Web基础篇之浅谈JVMJava Web基础篇之浅谈JMMJava Web基础篇之网络基础Java Web框架篇Java Web框架篇之SpringMVC...

2019-06-11 23:20:10 5338

原创 剑指Offer-数据结构与算法题目(Java实现)

1、栈与队列【实现一个栈】【实现一个队列】【构造一个栈,取最大最小、pop()、push()都是o(1)】【两个栈实现一个队列】【两个队列实现一个栈】【栈的入栈、出栈序列】2、链表的基本操作【链表反转】【按k步反转链表】【取链表的倒数k个数&中间节点】【两个有序链表合成一个有序链表】【删除重复节点】【取两个链表的第一个交叉节点】【取链表中环的第一个节点】【约瑟...

2019-05-24 23:05:37 798

原创 leetcode经典编程题目(Java实现)-持续更新

1、树【Minimum Depth of Binary Tree】【binary-tree-postorder-traversal】【binary-tree-preorder-traversal】2、栈【evaluate-reverse-polish-notation】3、穷举法【max-points-on-a-line(Java)】4、链表【sort-list】【insert...

2019-05-12 23:22:54 3507 1

原创 golang pbkdf2加密存储用户密码

概述PBKDF2(Password-Based Key Derivation Function) 是一个用来导出密钥的函数,常用于生成加密的密码。原理是通过 password 和 salt 进行 hash 加密,然后将结果作为 salt 与 password 再进行 hash,多次重复此过程,生成最终的密文。如果重复的次数足够大(几千数万次),破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。用户密码采用PBKDF2算法存储,比较安全。代码package pbkdf2import

2020-07-01 20:52:02 2933

原创 Golang发送HTTP请求

Golang发送HTTP请求import ( "bytes" "encoding/json" "errors" "io" "io/ioutil" "net/http" "github.com/golang/glog")// AuthResp 授权码返回结构type AuthResp struct { Token string `json:"token"`}// GetAuthHeader 获取auth headerfunc GetAuthHeader() (header

2020-07-01 20:37:45 6450

原创 Git合并多个提交记录并推送到远程分支

背景当我们错误提交代码到远程仓库后,比如错误提交了一个密钥到远程仓库,之后又提交了删除密钥,别人就可以通过提交记录看到你的密钥,这时候需要把多个提交记录合并为一个,并推送到远程分支步骤查看最近几次的提交记录git rebase -i HEAD~5交互式命令行中输入命令进行合并输入i进入编辑模式,要合并的记录修改pick为s进行合并,之后输入:wq保存根据提示修改冲突,无冲突直接进入下一步了修改冲突后,git rebase --continue 进入下一步查看新的git log 保存退

2020-06-12 17:01:37 2731

原创 Golang实现结构体签名验签&grpc/gin中间件

设计目标支持RSA2加签验签(解析密钥方式:PKCS1 数字签名算法:SHA256)支持grpc拦截器加签验签,对业务代码无侵入支持gin框架中间件验签,支持客户端发送http请求设置加签信息到Header中支持服务端对接多语言客户端(签名原文为:有序JSON(ASCII码序排序Key,忽略结构体/Map中的0值和空值),RSA2加签(PKCS1+SHA256))签名package signatureimport ( "crypto" "crypto/rand" "crypto

2020-05-08 18:59:22 4402

原创 go-chart实现折线图/饼图/柱状图绘制

需求邮件中实现统计信息的发送。统计信息以折线图、饼图、柱状图的形式展示。因为邮件中无法支持js解析,所以采用go-chart生成PNG图片后base64编码后发送。<img src="data:image/png;base64,xxx">go-chart实战go-chart是个强大的go生成图片的库,但是采用默认配置生成线条较多或者文本过长的图片时,无法完美适应。默认不支持中...

2020-03-30 15:28:33 9506 2

原创 登录的双因素认证-Golang实现

需求实现登录双因素认证开源库使用框架:github.com/gin-gonic/gin验证码:github.com/dchest/captchasession管理:github.com/gorilla/sessions + github.com/boj/redistoreOTP:privacyidea + github.com/xlzd/gotp邮件发送:gopkg.in/gomai...

2020-03-20 16:25:13 1505

原创 openresty lua 发送http请求

openresty中http请求环境构建:openresty docker依赖:lua-resty-http可直接下载http.lua/http_headers.lua放到/usr/local/openresty/lualib/resty/目录下即可lua脚本对请求拦截nginx.conf配置文件中如下处理http模块中添加 # lua package path 支持引用/us...

2020-03-20 16:04:04 7651 1

原创 Go与Nginx(lua-resty-string)跨语言加解密

需求用户登录后,go服务端把身份、IP信息等加密放到cookie中。Nginx(基于openresty构建)lua解密,比较访问的IP与cookie中记录的IP是否一致,不一致则进行拦截。跨语言的AES加解密,关键还是使用一致的模式、填充和向量。Nginx lua AES加解密环境构建:openresty docker依赖:lua-resty-stringlua-resty-strin...

2020-03-20 15:01:00 2386

原创 ZooKeeper-分布式小文件存储系统--构建精致的应用

初始需求元数据的存储(小数据)分布式、高可用读多写少、高性能读有序访问设计单机层面节点数据结构的选取树结构,每个节点是一个ZNode数据保存在内存中优点:高效读写为什么ZK不擅长存储大的数据?单机高效写磁盘高效写磁盘的两种方式:顺序写磁盘预分配磁盘空间ZK每次写磁盘,先申请固定大小的磁盘空间,之后再写磁盘,大大提升写入性能。顺序写数据每次写入操作,...

2019-12-16 20:37:29 739

原创 Go的字符串操作

计算字符串的长度Go语言中的字符串都是以UTF-8格式保存的,每个中文占三个字节,因此使用len()获取两个中文文字对应的6个字节。如果是按照习惯上统计中文字符,使用UTF-8包中提供的RuneCountInString()函数即可package mainimport ( "fmt" "unicode/utf8")func main() { fmt.Println("hell...

2019-12-05 16:33:20 630

原创 Golang开发环境搭建及第一个Go程序HelloWorld

安装GoLandhttps://www.jetbrains.com/go/安装go sdk选择版本后,下载即可。选择go path,类似于workspace添加后选择目录即可新建工程新建文件main.go打印hello worldpackage mainimport ( "fmt")func main() { fmt.Println("hello world...

2019-12-01 18:17:17 939

原创 为什么是RocketMQ & Spring Boot集成RocketMQ

为什么是RocketMQRocketMQ主要是针对online服务,提供可靠存储的消息中间件持久化 & 多副本RocketMQ可配置为 3副本、异步复制、异步刷盘,类比kafka的的replica_factor=3, acks=leader;在这种配置之下,可靠性99.99%,可用性99.95%。同时可以针对特殊场景,提供同步刷盘、同步复制的集群,提供更高的可靠性,在6副本、同步复制...

2019-11-21 11:30:04 559

原创 Spring Boot多数据源配置/读写分离(Druid+MyBatisPlus)

SpringBoot配置多数据源/读写分离整体步骤Jar包引入 spring boot + druid + mybatis plus(多数据源&分页)application.yml配置多数据源及mybatis plus mapper配置新建动态数据源DynamicDataSource(继承AbstractRoutingDataSource),ThreadLocal中获取当前使用哪个...

2019-11-15 20:38:12 2696

原创 Spring Boot集成Durid连接池与MyBatis generatorConfig

Spring Boot集成Druid、MyBatis基本步骤Jar包引入application.yml配置数据源信息指定MyBatis mapper路径可使用MyBatis generatorConfig生成Mapper Domain等,后修改不合适的命名,删除不需要的接口等数据库操作测试,Druid监控界面查看SQL性能等指标POM依赖使用的版本 <dru...

2019-11-14 18:23:06 557

原创 Spring Boot国际化的两种实现及logback配置

Spring Boot国际化的基本步骤定义国际化资源文件 xxx.properties配置文件application.yml中定义国际化资源文件的路径确定并实现对应国际化策略(一般使用拦截器实现)几种国际化实现策略1)部署时通过环境变量确定国际化语言,部署完成后不能改变。适合场景:软件部署后,只服务于同一语言环境的用户,部署后不需要改变。如,在国内部署,部署为中文,访问者均使用中文环...

2019-11-12 21:58:07 853 2

原创 Spring Boot接口验签(拦截器实现&解决Post请求body的输入流只能读取一次问题)

SpringBoot集成拦截器-接口签名的统一验证demo-web module添加拦截器实现类,接口验签使用MD5package com.springboot.demo.web.interceptor;import com.google.gson.Gson;import com.springboot.demo.common.constants.Constants;import com...

2019-11-12 16:34:00 9304 3

原创 Spring Boot服务构建、模块拆分及Profile集成

项目搭建步骤1、新建project(使用IDEA JDK8)2、修改默认的Group Artifact3、选择需要的依赖jar包等 如lombok及其他需要的组件等(也可后续自己在pom.xml添加)4、创建后的文件结构(手动删除了.mvn目录、mvnw等)后如下:可运行DemoApplication.java查看是否运行成功并结束(此时使用的jar包为spring-boot-s...

2019-10-21 17:31:24 507

原创 如何给共享文件夹中的图片添加水印

场景一个图片文件查看或者下载前需要加上水印,文件本身存储在共享文件夹下。共享文件(Smb共享)mac下共享文件操作步骤:系统偏好设置-共享-文件共享-使用smb共享文件或文件夹,访问用户为guset,密码为空系统偏好设置-用户和群组-解锁-客人用户-允许客人登录到这台电脑百度经验 Mac如何共享文件夹linux下共享文件操作步骤:安装smb-创建文件夹-修改smb配置文件-...

2019-09-27 18:17:06 1763

原创 文件上传或消息推送方案探讨

场景一大批文件需要上传到文件服务器,目前已经有文件表T_FILE里面存储了文件路径等信息。实现方案一文件表T_FILE新增一字段UPLOADSTATUS标识回单是否已经成功上传。每天0点定时任务,上传前一天新收到的文件和之前上传失败的文件到影像系统中。对上传失败的文件,进行重试操作,每次重试间隔加一个周期(如10min)。优点:不需要额外的表支持缺点:耦合文件表T_FILE严重;任务一...

2019-09-24 17:32:31 376

原创 Java Web问题杂谈

如何构建springboot服务:1、使用idea spring构建项目2、构建不同的profile test pre prd等3、使用mybatis代码生成器4、本地构建代码后 上传jar包到maven私服的配置5、引用本地的jar包 xxx system6、junit测试代码编写 引用少、粒度小、明确的输出(assert判断)7、@Slf4j、logback日志框架8、把依赖的...

2019-09-24 17:06:45 321

原创 Java并发工具类之CompletableFuture&StampedLock&ConcurrentSkipListMap

CompletableFutureCompletableFuture是在Java8中引入的,拥有强大的功能,支持回调、工作流、异常处理等。CompletableFuture还是典型的Java8的工具类,有函数式编程、链式方法和语义化接口等.除了Future接口,CompletableFuture还实现了CompletionStage接口。这个接口内容丰富,CompletableFuture的工...

2019-08-06 18:11:37 385

原创 Java并发的场景&原因&问题浅谈

并发的三种场景分工各司其职,完成各自的工作同步有分工就要有同步,不同工人之间要协作,不同线程也是互斥多线程访问相同的共享变量,就需要做互斥处理。分工与协作强调的是性能,互斥问题强调的是正确,即线程安全问题。Java解决互斥问题提供了很多思路与工具。避免共享,没有共享,没有竞态,就没有伤害,如ThreadLocal;没有改变,如果大家都不做改变,都是只读的,一起也没有错;Copy...

2019-08-05 11:39:34 1215

原创 Java基础CleanCode之lombok&try-with-resources

Lombok之@Data、@Accessorspackage com.base;import lombok.Data;import lombok.experimental.Accessors;// @Data等价于@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的集合@Data// 为属性se...

2019-08-02 18:00:14 363

转载 @PathVariable注解详解

实现思路请求路径如:/person/list/101。使用正则将id为key,101为value填充到map中放到request域中。为目标方法形参设置参数时拿出request域中的值然后赋值。实现原理@PathVariable注解对应的解析器是PathVariableMethodArgumentResolver根据HandlerMapping映射处理器获得HandlerExecution...

2019-07-27 17:36:04 1874

原创 Jconsole远程连接Java进程

1、Java进程所在的tomcat容器的start.sh添加如下配置JAVA_OPTS="-Dfile.encoding=UTF-8" JAVA_OPTS="$JAVA_OPTS -Dlog.dir=$LOG_PATH" JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(本机IP) -Dcom.sun.manag...

2019-07-15 16:33:11 1992

原创 leetcode 最小覆盖子串(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目最小覆盖子串 leetcode 76 题目描述Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n)....

2019-07-03 15:12:27 2822

原创 leetcode 滑动窗口最大值(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目滑动窗口最大值 -- leetcode 239题目描述给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。示例:输入: nums = [1,3,-1,-3,5,3,6...

2019-07-03 15:01:59 2728

原创 leetcode 二叉树的最近公共祖先(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目二叉树的最近公共祖先 -- leetcode 236题目描述给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己...

2019-07-03 14:58:54 6932

原创 leetcode 二叉搜索树的最近公共祖先(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目二叉搜索树的最近公共祖先 -- leetcode 235题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是...

2019-07-03 14:56:00 355

原创 leetcode 打家劫舍III(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目打家劫舍III -- leetcode 337题目描述在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”...

2019-07-03 14:40:15 520

原创 leetcode 打家劫舍II(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目打家劫舍II -- leetcode 213题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给...

2019-07-03 14:37:03 569

原创 leetcode 打家劫舍(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目打家劫舍 -- leetcode 198题目描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动...

2019-07-03 14:34:32 705

原创 leetcode 矩阵中的最长递增路径(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目矩阵中的最长递增路径 -- leetcode 329题目描述给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。示例 1:输入: nums = [ [9,9,4], [6,6,...

2019-07-03 14:30:00 1736

原创 leetcode 最长上升子序列(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目最长上升子序列 -- leetcode 300题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组...

2019-07-03 11:56:37 2850

原创 leetcode 最长递增子序列的个数(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目最长递增子序列的个数 -- leetcode 673题目描述给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2...

2019-07-03 11:53:11 2531

原创 leetcode 搜索旋转排序数组II(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目搜索旋转排序数组II -- leetcode 81题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 fa...

2019-07-03 11:46:36 332

原创 leetcode 搜索旋转排序数组(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)leetcode题目搜索旋转排序数组 -- leetcode 33题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你...

2019-07-03 11:42:35 733

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除