自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

csdn闻声即知人的博客

目前还是默默无闻的码农

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

原创 服务器静态文件防篡改

本文调研了对CDN静态资源进行篡改的几种攻击手段,针对每种攻击手段,也调研了相应的防护手段,对于这些防护手段,思考服务器端有哪些可以做的防护措施。篡改CDN静态资源的几种常见攻击手段。

2024-06-19 20:50:44 875

原创 生成能够精确匹配原字符串的正则表达式

需要将不同的公司名称归一化比如namecheap, NAMECHEAP. INC. 等表示同一含义,但是规则不,需要归一化为同一个文本含义。同本文使用java语言实现了由一串字符串自动生成正则表达式,并介绍了归一化不同表达方式的公司为同一个公司的方案。

2024-04-26 13:54:55 881

原创 使用Spring进行文件的上传和下载

本文主要介绍在Spring框架下面调用微服务的dubbo rpc接口进行文件的上传和下载,以及记录在实现过程中遇到的一些容易出错的地方。我们构建的RPC接口采用的是dubbo框架,最初始的接口设计,将HttpServletResponse作为接口的参数类型传参,结果报错。HttpServletResponse不能被dubbo作为接口参数序列化,于是转而求其次,将可序列化的类型byte[]作为传输流的参数。

2024-04-17 17:46:23 1024

原创 JavaMail实现邮件的回复

实现回复邮件,实际上就是实现邮件的发送,在邮件发送的基础上加上要回复邮件的信息,发送邮件的实现中存在一些坑,在后文中会有说明。

2024-01-26 15:14:20 637 1

原创 NIO原理浅析(三)

epoll在内核中使用红黑树这个数据结构来保存文件描述符,红黑树这个数据结构的增删改的时间复杂度为O(logn),select/poll每次监听套接字,都需要将套接字列表整个复制到内核态,而epoll使用epoll_ctl,每次将一个监听套接字复制到内核态,这明显减少了用户空间到内核态的大量数据拷贝和内存分配。:本函数用于监控事件的发生,当epoll监控的事件中存在已经发送的事件,那么就可以将此事件收集起来。如果为0,表示已经超时;返回值:如果成功,返回epoll专用的文件描述符,如果失败,则返回-1。

2023-09-05 10:54:44 662 1

原创 NIO原理浅析(二)

IO分类阻塞和非阻塞阻塞IO:用户空间引发内核空间的系统调用,需要内核IO操作彻底完成之后,返回值才会返回到用户空间,执行用户的操作。阻塞指的用户空间程序的执行状态,用户空间程序需要等到IO操作彻底执行完毕。java中,默认创建的socket是阻塞的。非阻塞IO:用户空间引发内核空间的系统调用,不需要等待内核IO操作彻底完成,内核立即给用户返回一个返回值。用户空间程序继续执行用户的操作,处于非阻塞的状态。有兴趣,也可以参考java中关于Socket这个类的同步和异步。

2023-08-30 17:14:58 576

原创 先加密后签名还是先签名后加密?

先说结论,签名算法计算出来的签名是为了验证消息的完整性,签名算法有比如HMAC-SHA256,加密算法则是为了保证消息的机密性,类似AES-GCM、AES-CBC,这两种加密算法的安全性并不一致。GCM的填充方式更加的安全,CBC则不然。如果先加密的话,因为加密之后值会随着随机因子的变化而变化,此时去校验加密之后密文的完整性是没有意义的,因为你只能校验加密之后密文的完整性,而加密之后密文的完整性是可以通过解密的过程来校验的。那谁来校验加密之前的消息的完整性呢?假设是先加密后签名,会发生什么事情?

2023-08-24 15:40:12 2624

原创 NIO原理浅析(一)

IO的定义,Input/Output,输入和输出,通常指数据在存储器或者其他周边设备之间的输出和输入,输入是系统接收到信号或者数据,输出则是从系统发送的信号或数据。

2023-08-24 12:18:59 383

原创 零知识证明技术概述

零知识证明又被称为零知识协议,利用数学知识在双方不需要直接传递信息本身的前提下来验证信息的正确性。这个思想首先被发表在1985年出版的MIT的论文里。

2023-08-06 17:32:13 779 1

原创 RSA原理

M *(1 + N的倍数)^{k} + N的倍数^d。= M^{kφ(N) + 1} + N的倍数^d。= M * M^{kφ(N)} + N的倍数^d。= M * M^{φ(N)K} + N的倍数^d。攻击者要破解C得到M,必须要知道d,攻击者只能拿到N、e、C。= M^{ed} + N的倍数^d。C^d = (M^e + N的倍数)^d。-> 要知道φ(N),必须要知道P、Q。

2023-07-16 22:33:46 388

原创 RestfulAPI接口设计指导

互联网的兴起,研究者思考如何开发以网络为基础的软件。Fielding提出了解决这个问题的软件架构原则:REST(Representational State Transfer),表现层状态转化。符合REST原则的架构,被称为RESTful架构,是目前互联网最流行的一种软件架构。REST的主语是Resource,即资源的表现层转化。资源:是网络上的具体信息,可以是文本、图片、歌曲、服务等,使用URI指向它,一般也把资源称为对象。

2023-07-11 20:32:56 306

原创 Java中ThreadLocal简要介绍

在这篇文章中,我们将会介绍ThreadLocal在java.lang这个包中是如何被构造的。ThreadLocal提供了在当前线程中单独存储数据,并能将特殊类型的对象保存在ThreadLocal里面的能力。

2023-07-09 20:14:06 294

原创 Java多线程--什么是线程安全?

也就是保证在多线程环境下,共享的、可修改的状态的正确性,这里的状态反映到程序中就是数据。线程安全是一个多线程环境下正确性的概念。

2023-07-03 19:56:19 121

原创 redis相关基础知识

redis默认有16个数据库,默认使用第0个数据库可以使用select进行数据库的切换用显示数据库的大小dbsize查看数据库所有的key,通过get方法可以得到所有的值keys *清除当前数据库flushdb清除数据库所有的内容flushallredis是单线程的!redis是基于内存操作的,CPU不是redis的性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽redis单线程还这么快?

2023-05-17 00:20:56 340

原创 【回溯法】-----求一个集合的子集问题

首先这个问题,是一个求子集的问题,求子集问题可以联想到组合问题和分割问题,如果把求解后两个问题的遍历过程形式化为树,我们可以认为组合问题和分割问题是求整棵树的叶子节点的过程。子集问题也可以认为是组合问题和分割问题,但是在求得整棵数的叶子节点之后,在求集合的并集时,需要去掉重复的子集,这个过程时间复杂度有点高,可以规避。按照此方法取出的节点,最终得到的集合中的子集是不会重复的。本题给出的nums里面的元素是。

2023-04-16 15:55:19 380

原创 go语言实现指令集和解释器

指令集和解释器Java虚拟机指的是一台虚拟的机器,字节码就是运行在这台虚拟机器上的机器码。每个类或者接口都会被Java编译器编译成一个class文件,类或者接口的方法信息放在class文件的method_info结构中,如果方法不是抽象方法,也不是本地方法,方法的Java代码就会被编译器编译成字节码,存放在method_info结构体的Code属性中。每条字节码指令是以一个单字节的操作码(opcode)开头,这就是字节码名称的由来。

2023-03-20 00:11:03 203

原创 Java虚拟机的运行时数据区-go语言实现

线程私有的区域包括了PC(程序计数器)和java虚拟机栈,Java虚拟机栈又由栈帧构成,帧保存了局部变量和操作数栈信息。一类时多线程共享的,一类时线程私有的。对于Java虚拟机栈,我们常用链表数据结构来实现,这样栈就可以按需使用内存空间,而且弹出来的帧可以被Go的垃圾收集器回收。虚拟机栈可以时连续的空间,也可以时不连续的,可以时固定大小,也可以时在运行时动态扩展。多线程共享的区域包括类和实例对象,实例对象保存在堆中,类保存在方法区中,其中类数据包含了类的方法、字段、方法字节码还有常量池信息。

2023-03-05 17:30:22 484

原创 解析Java中的class文件

解析class文件需要把class文件当成文件流来处理,定义ClassReader结构体go语言中的reslice语法可以跳过已经读过的数据。ClassFile结构体如实反映了Java虚拟机规范定义的class文件格式。class文件的魔数为0xCAFEBABE占四个字节minorVersion为class文件的次版本号majorVersion为class文件的主版本号constantPool为常量池acessFlags为class的可访问标识。

2023-02-22 13:00:10 483

转载 如何做一次合格的胶片演讲

ppt制作与演讲技巧

2023-02-13 01:33:54 110

原创 Go语言实现搜索class文件工具

答:不同虚拟机的实现,决定了不同的搜索方法,Oracle的Java虚拟机实现根据类路径(class path)来搜索类。ZipEntry类表示ZIP或者JAR文件形式的类路径,该类的初始化方法中,打开ZIP文件,然后遍历ZIP压缩包文件,然后找到class文件,将class内容读出来。所有的类都实现了Entry这个接口,该接口有两个方法,readClass方法根据类路径访问类和字节数组,String方法返回类的名字。ClassPath类里面有三个成员变量,分别存放三种路径,通过Parse函数初始成员变量。

2023-02-06 00:25:04 449

原创 Go语言处理命令行参数

java命令行的选项可以分为两种:标准选项和非标准选项。标准选项比较稳定,不会轻易变动,非标准的选项以-X开头。非标准选项中有一部分是高级选项,以-XX开头。go语言的os包中定义了一个Args变量,用来存放传递给命令行的全部参数。如果给出了-jar选项,则第一个非选项参数表示JAR文件名,java命令必须从这个JAR文件中寻找主类。javaw和java命令唯一的区别在于,javaw显示命令行窗口后不会堵塞,会继续执行接下来的命令。选项由减号(-)开头,第一个非选项名给出了主类的完全限定名。

2023-01-27 22:27:54 416

原创 【ECDH java后端和javaScript前后端互通实现】

Elliptic-curve Diffie-Hellman(ECDH)是一种通过两方达成密钥协商的密钥生成算法,每一方都有一个椭圆双曲线的公私钥对,双方在不安全的通信通道间传递信息达成密钥生成协议。在初始时刻,Alice和Bob共享了些域的参数(p a,b,G,n,h),Alice在整数范围[t,n-1]中随机选择一个私钥d,并通过计算(Q=d·G)web前端和后端之间的通信不一定可靠,如果不方便使用预共享密钥的方式完成身份的确认,那么可以使用ECDH密钥协商算法在前端和后端进行密钥间的协商。

2022-12-12 00:33:59 1306

原创 工厂模式相关总结和使用

工厂方法模式对于Pizza的创建方式进一步解耦,如果orderPizza发生变化,比如需要订购不同种类的pizza,不会改变pizza的实现,如果需要改变Pizza的创建构成,也不需要改变orderPizza方法,满足对修改关闭,对扩展开放的开闭原则。简单工厂模式中,Pizza作为一个接口,里面包含了多种功能,包括prepare、bake、cut、box,Pizza被实现成多个产品。工厂方法模式将产品的实现从使用中解耦,如果需要增加产品或者改变产品的实现,创建接口creator相关代码不需要做任何改变。

2022-09-06 00:57:33 337

原创 单调栈的性质和使用场景

单调栈即需要保证入栈的元素是保持递增或者递减的。如果有违反递增或者递减的原则,那么就需要通过弹出栈的方式来保持单调栈的性质。单调栈常被用来解决滑动窗口中元素最大值和最小值的问题。.........

2022-08-26 23:47:55 332

原创 C++ signed int 在计算机内部表示

数字化的世界都是由现实的世界转换而来,这个转换过程需要媒介,电压的高低能很好的表示0和1两种状态,满足离散化和编码两种能力,由于计算机设备本身的硬件限制,只能离散化数据,对数据取样。编码则是需要通过制定一定的规则来模拟还原现实信息。采用二进制有如下好处:1、状态稳定,只有0、1两种状态。2、二进制编码简单,对于机器实现来说计算简单。3、0、1和逻辑命题真、假对应,与逻辑门契合。..................

2022-08-10 20:59:37 575

原创 JAVA中的异常体系详解

一般异常可以分成如下几类:1、用户输入的错误用户不可预期的输入内容2、设备错误IO设备的错误,硬盘损坏等等3、物理限制磁盘的空间满了4、代码错误引用了空指针。有四种场景抛出受查异常:1、调用一个抛出受查异常的方法2、程序运行时抛出错误,使用throw语句抛出异常3、程序出现错误4、Java虚拟机和运行库出现的内部错误异常抛出后,Java 会使用new方法在堆上创建一个异常对象。当前的执行路径会被终止,从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个异常处理

2022-06-15 23:10:40 330

翻译 《对服务设计的思考(2)》--- 翻译自《Considerations for Service Design》

避免意外API可能因为不恰当的使用而以不可预知的方式运行。一些微妙的设计决策往往会造成下游开发者雪崩式的影响。为此应该遵循以下所示的规则:应该规避polymorphism(多态性),特别是在response中,为了避免SDk动态运行时产生意想不到的问题,一个endpoint应该使用单一的类型。应该使用一个单一类型(homogeneous collection),除非有非常好的理由,否则不要返回异构集合。如果你感觉到异构集合是必须的,请与你的API reviewer来讨论需求。应该支持服务器端的分

2022-05-16 23:45:37 104

翻译 《对服务设计的思考(1)》--- 翻译自《Considerations for Service Design》

对服务设计的思考本文主要是一份读书笔记,摘抄博文作者在该篇文章中重要的部分。原文链接简介为了避免设计的API对于使用者造成困扰,需要满足以下三个原则:从服务的第一个已发布版本开始实施API版本控制确保客户的工作负载不会被中断确保客户在实施新的服务或者集成SDK时,不需要修改原有的代码从开发者经验开始一个好的API通常是开始于深思熟虑和良好设计的服务。你的服务需要被定义为一系列容易理解的概念名,只要一提到你的这些概念名就能想起你这个服务。这些抽象概念之间必须有明确的关系。为了让你能够针对

2022-05-15 16:33:51 114

原创 动态规划通用解法

动态规划模板实践-01背包

2022-05-01 15:32:06 406

原创 数据库中的事务

什么是事务?事务是指数据库中一系列数据库语句的集合,在mysql中,通常以start transaction;作为一个事务的语法开头,commit;作为事务的结尾,一则事务要么全部执行,要么全部不执行。我们可以将事务作为数据库中一个逻辑执行单元(不可分割)来理解。类似于操作系统的中将一条指令作为不可分割的单位。事务的出现主要被用来解决数据库在并发场景下存在的数据不一致性问题。事务的性质ACID:Atomic:(原子性):不可分割的特性Concurrent(一致性):状态转移的一致性Isolat

2022-03-16 00:17:25 1798

原创 一条SQL语句的执行是什么样的?

1、执行步骤总览客户端JDBC、ODBC触发一条sql语句的运行。2、具体架构2.1 连接器身份认证和权限相关部分的管理。如果用户名密码通过校验,会去权限表里查询该用户的权限。后续只要连接不断开,即使管理员修改了用户的权限,用户权限也维持刚开始查询时的状态。2.2 查询缓存连接建立后,执行查询语句的时候,会先查询缓存,MySQL 会先校验这个 sql 是否执行过,以 Key-Value 的形式缓存在内存中,Key 是查询预计,Value 是结果集。如果缓存 key 被命中,就会直接返回给客户端

2022-03-07 00:32:55 358

原创 如何判断设计数据库是否合理?

摘要本文讲述如何判断设计的数据库是否合理(设计的数据库表符合第一范式、第二范式、第三范式等)前置知识超码、候选码、主码超码关系的超码是一个或者多个属性的集合,这些属性上的取值保证可以唯一识别出关系中的元组。举个例子,有属性为<学号,身份证,姓名,年龄,班级>这样的一个表,其中学号、身份证或者<学号,身份证>都能唯一识别出关系中的元组。那么学号、身份证以及<学号,身份证>都被称为超码。候选码候选码是一个最小的超码,它是一组构成超码的属性集,但是这组属性的任意

2021-09-21 23:11:16 989

原创 https会话过程详解

这里写自定义目录标题https预置条件httpshttp协议无法证明客户端和服务器的合法性,客户端可以接受所有服务的response,服务器也可以接受所有客户端的request,无法抵御中间人攻击,为了解决这个问题https协议就诞生了,https协议就是http协议在应用层和传输层之间加了一层SSL层,该层即对应用层传输内容进行加密,具体过程如下图所示:预置条件客户端和服务器端需要预制证书,该证书由可信第三方机构颁发,具体过程见下一篇博客。使用该证书可以用来验证请求是否合法。...

2021-09-05 23:40:48 409

原创 SpringBoot获取环境中的bean

问题描述Springboot在初始化时会根据添加路径扫描环境被加了@Service @Component等注解的类,这类注解的类是一个Bean,可以被视为一个单例。如果你要初始化的类的实例在系统稳定运行时被频繁产生并销毁,那不适用于单例:@Servicepublic class EcdhAlg implements Alg { private Integer version = 0; private String ecdhPublicKey = ""; private E

2021-04-12 23:41:38 157

原创 SQL基础教程读书笔记(二)

聚合函数五大常用的聚合函数:函数名用途count计算表中的记录数sum计算表中数值列中数据的合计数avg计算表中数值列中数据的平均值max求出表中任意列中数据的最大值min求出表中任意列中数据的最小值注意:(1)使用count(*)可以查出包含null在内的全部数据的行数。使用select count(purchase_price)可以计算purchase_price这列中非空行的数目。(2)max/min函数几乎适用于所有数据类型的列。s

2021-03-11 00:45:14 133

原创 SQL基础教程读书笔记(一)

数据库的基本操作本文以MYSQL语法为例。数据库的创建创建数据库shop。create database shop;表的创建使用数据库 databaseuse shop;在数据库shop中创建表productcreate table Product(product_id char(4) not null,product_name varchar(100) not null,product_type varchar(32) not null,sale_price integer,

2021-02-21 23:52:42 205

原创 golang命令模式

命令模式概述命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。同时命令模式也支持可撤销的操作。模式实例比如餐厅里的女招待,一整天下来参数化许多的订单。又比如一个简单的遥控器,这个遥控器的按键command被抽象化为一个接口,只需要用譬如“打开电灯”、“打开车库门”之类的命令实现这个接口。就可以轻易的实现命令模式。UML图示例如上所示的图中,声明了一个Command接口,ConcreteCommand实现了Command接口,Invoker是一个调用者,它不需要了解C

2021-01-24 16:41:51 269

原创 go判断接口是够为空

func InterfaceIsNil(i interface{}) bool {ret := i == nilfunc InterfaceIsNil(i interface{}) bool { ret := i == nil if !ret { defer func() { recover() }() ret = reflect.ValueOf(i).IsNil() // there will exit so.

2021-01-24 16:34:43 567

原创 golang读取证书中的SubjectAlternativeNames(扩展字段)

简述任务:在实际开发中需要使用golang读取证书中SubjectAlternativeNames字段的内容。标准证书是由ASN1编码生成的,Java可以使用java.security.cert包中的X509Certificate类中getSubjectAlternativeNames()方法来提取这个扩展字段的内容。golang官方库中提供了X509这个包来实现asn1编码,其所对应的证书字段为:// A Certificate represents an X.509 certificate.t

2021-01-24 16:28:23 1831

原创 golang结构体转json(序列化与反序列化)

golang结构体转json读取json文件,并将该json文件转换成代码中的结构体输入一个json文件,结构如下所示:{ "kekMap" : { "1" : { "version" : 1, "cipherKey" : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" } }}输出可以转换成的结构体为:type KekData struct { KekMap map[int64] K

2021-01-08 00:44:49 1190

空空如也

空空如也

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

TA关注的人

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