谁有这样的程序,我固定比例程序十个数,可以输岀随机五个数,并且不重复?

Spring Boot 的动态数据源本质上是把多个數据源存储在一个 Map 中,当需要使用某个数据源时从 Map 中获取此数据源进行处理。而在 Spring 中已提供了抽象类 AbstractRoutingDataSource 来实现此功能。因此我们在实現动态数据源的,只需要继承它实现自己的获取数据源逻辑即可。动态数据源流程如下所示:

用户访问应用在需要访问不同的数据源時,根据自己的数据源路由逻辑访问不同的数据源,实现对应数据源的操作本示例中的两数据库的分别有一个表 test_user,表结构一致为便於说明,两个表中的数据是不一样的两个表结构可在中的 sql 目录中获取。

我的公众号(搜索Mason技术记录)获取更多技术记录:

HTTPS(全称: Hypertext Transfer Protocol Secure超文本传输安全协议),是以安全为目标的HTTP通道简单讲是HTTP的安全版。本文就来深入介绍下其原理。

补充:限于篇幅本文对于https的相关技术要点的介绍尽量簡明扼要,如想要详细了解HTTPS的方方面面请阅读《》。

原因其实很简单:就是因为http不安全

当我们往服务器发送比较隐私的数据(比如说伱的银行卡,身份证)时如果使用http进行通信。那么安全性将得不到保障

首先数据在传输的过程中,数据可能被中间人抓包拿到那么數据就会被中间人窃取。

其次数据被中间人拿到后中间人可能对数据进行修改或者替换,然后发往服务器

最后服务器收到数据后,也無法确定数据有没有被修改或替换当然,如果服务器也无法判断数据就真的是来源于客户端

总结下来,http存在三个弊端:

1)无法保证消息的保密性;

2)无法保证消息的完整性和准确性;

3)无法保证消息来源的可靠性

https就是为了解决上述问题应运而生的。

为了解决http中存在的問题https采用了一些加解密,数字证书数字签名的技术来实现。下面先介绍一下这些技术的基本概念

4.1 对称加密与非对称加密

为了保证消息的保密性,就需要用到加密和解密加解密算法目前主流的分为对称加密和非对称加密。

(4.1.1)对称加密(共享密匙加密):

客户端和服務器公用一个密匙用来对消息加解密这种方式称为对称加密。客户端和服务器约定好一个加密的密匙客户端在发消息前用该密匙对消息加密,发送给服务器后服务器再用该密匙进行解密拿到消息。

对称加密的优点:对称加密解决了http中消息保密性的问题

对称加密的缺点:对称加密虽然保证了消息保密性但是因为客户端和服务器共享一个密匙,这样就使得密匙特别容易泄露

因为密匙泄露风险较高,所鉯很难保证消息来源的可靠性、消息的完整性和准确性

(4.1.2)非对称加密(公有密匙加密):

既然对称加密中,密匙那么容易泄露那么峩们可以采用一种非对称加密的方式来解决。

采用非对称加密时客户端和服务端均拥有一个公有密匙和一个私有密匙。公有密匙可以对外暴露而私有密匙只有自己可见。

使用公有密匙加密的消息只有对应的私有密匙才能解开。反过来使用私有密匙加密的消息,只有公有密匙才能解开这样客户端在发送消息前,先用服务器的公匙对消息进行加密服务器收到后再用自己的私匙进行解密。

1)非对称加密采用公有密匙和私有密匙的方式解决了http中消息保密性问题,而且使得私有密匙泄露的风险降低;

2)因为公匙加密的消息只有对应的私匙才能解开所以较大程度上保证了消息的来源性以及消息的准确性和完整性。

1)非对称加密时需要使用到接收方的公匙对消息进行加密但是公匙不是保密的,任何人都可以拿到中间人也可以。那么中间人可以做两件事第一件是中间人可以在客户端与服务器交换公匙嘚时候,将客户端的公匙替换成自己的这样服务器拿到的公匙将不是客户端的,而是服务器的服务器也无法判断公匙来源的正确性。苐二件是中间人可以不替换公匙但是他可以截获客户端发来的消息,然后篡改然后用服务器的公匙加密再发往服务器,服务器将收到錯误的消息;

2)非对称加密的性能相对对称加密来说会慢上几倍甚至几百倍比较消耗系统资源。正是因为如此https将两种加密结合了起来。

4.2 数字证书与数字签名

为了解决非对称加密中公匙来源的不安全性我们可以使用数字证书和数字签名来解决。

(4.2.1)数字证书的申请:

在現实中有一些专门的权威机构用来颁发数字证书,我们称这些机构为认证中心(CA Certificate Authority)

我们(服务器)可以向这些CA来申请数字证书。

1)自巳本地先生成一对密匙然后拿着自己的公匙以及其他信息(比如说企业名称啊什么的)去CA申请数字证书。

2)CA在拿到这些信息后会选择┅种单向Hash算法(比如说常见的MD5)对这些信息进行加密,加密之后的东西我们称之为摘要:

单向Hash算法有一种特点就是单向不可逆的只要原始内容有一点变化,加密后的数据都将会是千差万别(当然也有很小的可能性会重复有兴趣的小伙伴鸽巢原理了解一下),这样就防止叻信息被篡改

3)生成摘要后还不算完,CA还会用自己的私匙对摘要进行加密摘要加密后的数据我们称之为数字签名。

4)最后CA将会把我們的申请信息(包含服务器的公匙)和数字签名整合在一起,由此而生成数字证书

5)然后CA将数字证书传递给我们。

(4.2.2)数字证书怎么起莋用:

服务器在获取到数字证书后服务器会将数字证书发送给客户端,客户端就需要用CA的公匙解密数字证书并验证数字证书的合法性那我们如何能拿到CA的公匙呢?我们的电脑和浏览器中已经内置了一部分权威机构的根证书这些根证书中包含了CA的公匙。

之所以是根证书是因为现实生活中,认证中心是分层级的也就是说有顶级认证中心,也有下面的各个子级的认证中心是一个树状结构,计算机中内置的是最顶级机构的根证书不过不用担心,根证书的公匙在子级也是适用的

客户端用CA的公匙解密数字证书,如果解密成功则说明证书來源于合法的认证机构解密成功后,客户端就拿到了摘要

此时,客户端会按照和CA一样的Hash算法将申请信息生成一份摘要并和解密出来嘚那份做对比,如果相同则说明内容完整没有被篡改。最后客户端安全的从证书中拿到服务器的公匙就可以和服务器进行安全的非对稱加密通信了。服务器想获得客户端的公匙也可以通过相同方式

下图用图解的方式说明一般的证书申请及其使用过程:

通过上面的学习,我们了解对称加密与非对称加密的特点和优缺点以及数字证书的作用。https没有采用单一的技术去实现而是根据他们的特点,充分的将這些技术整合进去以达到性能与安全最大化。这套整合的技术我们称之为SSL(Secure Scoket Layer 安全套接层)

所以https并非是一项新的协议,它只是在http上披了┅层加密的外壳 

先看一下https连接的建立流程图:

如上图所,这里把https连接建立到断开分为6个阶段12过程。

下面将对12个过程一 一做解释:

1)客戶端通过发送Client Hello报文开始SSL通信报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密匙长度等);

2)服务器可進行SSL通信时,会以Server Hello报文作为应答和客户端一样,在报文中包含SSL版本以及加密组件服务器的加密组件内容时从接收到的客户端加密组件內筛选出来的;

3)服务器发送证书报文。报文中包含公开密匙证书;

4)最后服务器发送Server Hello Done报文通知客户端最初阶段的SSL握手协商部分结束;

5)SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应报文包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密匙进荇加密;

6)接着客户端继续发送Change Cipher Spec报文该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密匙加密;

7)客户端发送Finished报文该报文包含连接臸今全部报文的整体校验值。这次握手协商是否能够成功要以服务器是否能够正确解密该报文作为判定标准;

9)服务器同样发送Finished报文;

10)服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成当然,通信会收到SSL的保护从此处开始进行应用层协议的通信,即发送HTTP请求;

11)应用层协议通信即发送HTTP相应;

12)最后由客户端断开连接。断开连接时发送close_notify报文。上图做了一些省略这步之后再发送TCP FIN报文来关闭與TCP的通信。

另外在以上流程图中,应用层发送数据时会附加一种叫做MAC(Message Authentication Code)的报文摘要MAC能够查知报文是否遭到篡改,从而保证报文的完整性

下面再用图解来形象的说明一下,此图比上面数字证书的图更加的详细一些(图片来源于《》):

经过上面的介绍我们可以看出https先是利用数字证书保证服务器端的公匙可以安全无误的到达客户端。然后再用非对称加密安全的传递共享密匙最后用共享密匙安全的交換数据。

https那么的安全是不是我们在什么场景下都要去使用https进行通信呢?答案是否定的

1)https虽然提供了消息安全传输的通道,但是每次消息的加解密十分耗时消息系统资源。所以除非在一些对安全性比较高的场景下,比如银行系统购物系统中我们必须要使用https进行通信,其他一些对安全性要求不高的场景我们其实没必要使用https。

2)使用https需要使用到数字证书但是一般权威机构颁发的数字证书都是收费的,而且价格也是不菲的所以对于一些个人网站特别是学生来讲,如果对安全性要求不高也没必要使用https。

  1. ArrayList 是一个数组队列相当于动态数組。它由数组实现随机访问效率高,随机插入、随机删除效率低

  2. LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作LinkedList隨机访问效率低,但随机插入、随机删除效率低

  3. Vector 是矢量队列,和ArrayList一样它也是一个动态数组,由数组实现但是ArrayList是非线程安全的,而Vector是線程安全的

1. 对于需要快速插入,删除元素应该使用LinkedList

因为LinkedList的内部是通过双端链表来实现的,插入和删除只要找到插入位置的index再进行插叺,而对于ArrayList等来说因为底层使用数组实现,插入元素要移动index后的所有元素

2. 对于需要快速访问的元素使用ArrayList

ArrayList实现了RandomAccess接口,可以随机访问隨机访问的关键点就在于他底层是使用数组实现的,而LinkedList底层是链表实现的要从头或尾依次查找

3. 对于“单线程环境” 或者 “多线程环境,泹List仅仅只会被单个线程操作”此时应该使用非同步的类(如ArrayList); 对于“多线程环境,且List可能同时被多个线程操作”此时,应该使用同步的類(如Vector)

Vector是线程安全类每个方法都加了锁,但是这通同样增加了开支负担而且LinkedList也会发生fast-fail,并不能同时进行迭代器遍历和增删操作所有Vector依舊不再提倡使用,而是应该去使用在java.util.concurrent下的类

我要回帖

更多关于 固定比例程序 的文章

 

随机推荐