让博客通过https进行访问
前言让博客通过https访问,可以增加网站的安全性,顺带着提升一点逼格。其实,最主要的还是,我看之前http访问时总有那个不安全字样,看着很碍眼,就像弄掉,今天终于如愿以偿。接下来就分享一下具体过程。
详细过程购买SSL证书打开阿里云>产品与服务>SSL证书选择如下所示然后填写相关信息,得到证书验证的相关参数
验证域名我域名是在腾讯云上,在解析域名那里将上述得到的相关参数填入,然后回去进行验证。
下载证书并配置验证通过之后即可下载证书,通过WinSCP将证书上传至云服务器,然后进入nginx配置文件进行配置,如下。
123456789101112131415161718192021222324252627282930313233server { listen 80 default_server; listen [::]:80 default_server; server_name delaunay.cn www.delaunay.cn; root /var/www/hexo; rewrite ...
SpringBoot红包项目实战
建立SpringBoot项目一开始选择 Spring Initializr 并next,填写Group以及项目名。下一步,选择最高版本的SpringBoot稳定版,选择Web项目。接着,填写项目名称以及路径后建立项目。
新建HelloController的java类文件1234567891011121314151617181920212223242526package com.delaunay.luckymoney;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation. ...
Netty入门与实战:仿写微信 IM 即时通讯系统(二)
源码地址及更新日志https://delaunay.coding.net/p/netty-demo/d/netty-demo/git
实战:Netty 实现客户端登录登录流程
客户端会构建一个登录请求对象,然后通过编码把请求对象编码为 ByteBuf,写到服务端。
服务端接受到 ByteBuf 之后,首先通过解码把 ByteBuf 解码为登录请求响应,然后进行校验。
服务端校验通过之后,构造一个登录响应对象,依然经过编码,然后再写回到客户端。
客户端接收到服务端的之后,解码 ByteBuf,拿到登录响应响应,判断是否登陆成功
客户端发送登录请求客户端处理登录请求ClientHandler.java
123456789101112131415161718public class ClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) { System.out.pr ...
Netty入门与实战:仿写微信 IM 即时通讯系统(三)(停更ing)
源码地址及更新日志https://delaunay.coding.net/p/netty-demo/d/netty-demo/git
实战:使用 channelHandler 的热插拔实现客户端身份校验身份检验首先,我们在客户端登录成功之后,标记当前的 channel 的状态为已登录
在登录成功之后,我们通过给 channel 打上属性标记的方式,标记这个 channel 已成功登录
判断一个用户是否登录很简单,只需要调用一下 LoginUtil.hasLogin(channel) 即可,但是,Netty 的 pipeline 机制帮我们省去了重复添加同一段逻辑的烦恼,我们只需要在后续所有的指令处理 handler 之前插入一个用户认证 handler:AuthHandler
在 MessageRequestHandler 之前插入了一个 AuthHandler,因此 MessageRequestHandler 以及后续所有指令相关的 handler(后面小节会逐个添加)的处理都会经过 AuthHandler 的一层过滤,只要在 AuthHandler 里面处理掉身份认证相关的逻辑,后 ...
Netty入门与实战:仿写微信 IM 即时通讯系统(一)
源码地址及更新日志https://delaunay.coding.net/p/netty-demo/d/netty-demo/git
系统简介Netty 是一个异步基于事件驱动的高性能网络通信框架,本文将利用Netty一步一步实现微信IM聊天的核心功能——单聊与群聊。
单聊基本流程
指令
群聊基本流程
指令
客户端使用 Netty 的程序逻辑结构
服务端使用 Netty 的程序逻辑结构
服务端启动流程服务端启动demo话不多说,直接上代码
NettyServer.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445public class NettyServer { public static void main(String[] args) { // bossGroup表示监听端口,accept新连接的线程组 NioEventLoopGroup bossGroup = new NioEventLoopGroup ...
Java数据结构(四)——栈
1.栈的基本概念 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表。
2.Java模拟简单的顺序栈实现12345678910111213141516171819202122232425262728293031323334353637383940414243/** * @author delaunay * @description 栈 * @date 2019 ...
Java数据结构(五)——队列
1.队列的基本概念 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。 比如我们去电影院排队买票,第一个进入排队序列的都是第一个买到票离开队列的人,而最后进入排队序列排队的都是最后买到票的。 在比如在计算机操作系统中,有各种队列在安静的工作着,比如打印机在打印列队中等待打印。 队列分为: ①、单向队列(Queue):只能在一端插入数据,另一端删除数据。 ②、双向队列(Deque):每一端都可以进行插入数据和删除数据操作。 这里我们还会介绍一种队列——优先级队列,优先级队列是比栈和队列更专用的数据结构, ...
Java数据结构(二)——数组
Java数组介绍在Java中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object类型数组除外)。
1.数组的声明1234//声明数组1,声明一个长度为3,只能存放int类型的数据int [] myArray = new int[3];//声明数组2,声明一个数组元素为 1,2,3的int类型数组int [] myArray2 = {1,2,3};
2.访问数组元素以及给数组元素赋值123456//声明数组,声明一个长度为3,只能存放int类型的数据int [] myArray = new int[3];//给myArray第一个元素赋值1myArray[0] = 1;//访问myArray的第一个元素System.out.println(myArray[0]);
3.数组遍历12345//声明数组2,声明一个数组元素为 1,2,3的int类型数组int [] myArray2 = {1,2,3};for(int i = 0 ; i < myArray2.length ; i++){ Syste ...
Java数据结构(三)——冒泡、选择、插入排序算法
冒泡排序 冒泡算法的运作规律如下: ①、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 ②、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数(也就是第一波冒泡完成)。 ③、针对所有的元素重复以上的步骤,除了最后一个。 ④、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071/** * @author delaunay * @description 冒泡排序 * @date 2019/07/18 **/public class BubbleSort { public static int[] sort(int[] array) { //这里for循环表示总共需要比较多少轮 for (in ...
Java数据结构(一)——简介
数据结构数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
一、数据结构的基本功能 ①、如何插入一条新的数据项 ②、如何寻找某一特定的数据项 ③、如何删除某一特定的数据项 ④、如何迭代的访问各个数据项,以便进行显示或其他操作
二、常用的数据结构
数据结构
优点
缺点
数组
插入快
查找慢,删除慢,大小固定,只能存储单一元素
有序数组
比无序数组查询快
查找慢,删除慢,大小固定,只能存储单一元素
栈
提供后进先出的存取方式
存取其他项很慢
队列
提供先进先出的存取方式
存取其他项很慢
链表
插入快,删除快
查找慢
二叉树
如果树都是平衡的,则查找、插入、删除都快
删除算法复杂
红黑树
查找、插入、删除都快,树总是平衡的
算法复杂
2-3-4树
查找、插入、删除都快,树总是平衡的
算法复杂
哈希表
如果关键字已知则存取极快
删除慢,如果不知道关键字存取慢,对存储空间使用不充分
堆
插入、 ...