自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 问答 (1)
  • 收藏
  • 关注

原创 面试题4:POST 比 GET 安全?

我们知道 GET一般将参数放到URL的查询字符串中,如果是实现登录页面,我们的用户名和密码就直接显示到浏览器的地址栏中了,此时就会轻易的被他人获取账号密码,很不安全。而POST会把参数放到 body 里,不会直接显示在URL上,所以更安全。虽然把用户名密码这些参数放到URL上的确不好,但是放到POST的body里也不见得就是安全,抓个包,就能看到body的信息了。HTTPS具有一定加密功能,但是实践中,主要还是会通过业务上的代码来进行加密。一般我们提到的网络安全,指的是:数据被黑客截获之后。

2024-06-23 16:58:23 154

原创 面试题3:GET 和 POST 有什么区别?

2、发请求时,给服务器传递的数据,GET 一般是放在查询字符串中,但GET 也可以把数据放在 body 里。POST 一般是放在 body 中,但是也可以放在 查询字符串 中,虽然少见,但是浏览器是可以支持的。如果当前GET不是幂等的,就需要通过特殊技巧避免浏览器产生缓存(典型的技巧就是让每次GET请求的URL都不相同:即通过特殊的查询字符串来保证 URL 的不同)。设计服务器时,就需要提供一些接口,接口传入的参数,就视为是输入,接口返回的接口,就视为是输出。幂等:输入结果是确定的,输出结果也是确定的。

2024-06-23 15:50:39 260

原创 面试题2:从浏览器输入一个URL,到最终展示前端页面这一过程,会发生什么?

交换机会把数据分用到数据链路层(更上层的就不用解析了),再重新封装,继续转发。路由器会把数据分用到网络层(更上层的就不用解析了),再重新封装,继续转发,路由器根据数据报中的目的IP在路由表中匹配,找个合适的方向发出去,每次转发,TTL就 - 1。就像 github 的域名是 www.github.com,很好记,但是他的 IP 地址是 20.205.243.166,其实我们在地址栏中输入github的IP地址,也是能够访问到github网站的,但是因为IP地址不好记,所以一般地址栏里输入的都是域名。

2024-06-22 20:53:03 247

原创 面试题1:如何使用UDP来实现可靠传输?

该面试题主要考查的是 TCP,虽然问的是 UDP ,但考察的是TCP。即基于UDP,在应用层实现超时重传机制、确认应答机制、引入序列号…

2024-06-20 14:10:12 109

原创 浅谈网络通信(3)

因为假设单个数据报丢包的概率为10%,那么第一次丢包的概率是0.1,第二次丢包的概率是0.1 * 0.1 = 0.01,因此丢包的概率是逐渐减小的,所以第二次传输,大概可以顺利到达的,所以超时重传的时间是逐渐变大的。那如果第二次传输也没有到达,说明当前网络环境比较糟糕,那单个数据报丢包的概率可能非常大,甚至概率是100%的,断网了,都断网了,再怎么频繁的重传,也没用,所以把超时重传的频率降低一点(时间间隔长一点),至少可以节省主机的开销。主机B的系统内核里,记录了一个数据结构,包含了和他连接的对方信息。

2024-06-15 21:58:37 1026

原创 浅谈网络通信(2)

应用层这一层,有很多现成的协议,也有很多时候,需要我们程序员自己去自定义应用层协议。自定义应用层协议,也是一件很简单的事情。举个例子:此处有一个需求场景:一个外卖软件,需要在用户打开此软件时,给用户显示用户住址附近的商家列表,列表中有很多项,每一项都包含了一些信息:譬如:商家名称、商家图片、商家店铺好评率,商家与用户的距离、商家评分…(其实外卖软件和服务器之间的沟通,有很多种方式,展示商家列表,只是其中之一)客户端(用户…):需要给服务器发起一个请求,服务器收到请求之后,就给客户端返回一个响应。

2024-06-12 11:14:12 1187

原创 浅谈JDBC

JDBC是一种可用于执行SQL语句的JAVA API,是链接数据库和JAVA应用程序的纽带。JDBC一般需要进行3个步骤:与数据库建立一个链接、向数据库发送SQL语句、处理从数据库返回的结果。

2024-06-09 19:04:23 255

原创 浅谈Spring MVC

1、Spring MVC 也叫做 Spring Web MVC,是基于Servlet 构建的,(因此之前在Servlet中的写法在MVC中同样适用,比如Servlet中的常用对象: Request、Response 对象,在MVC中同样可以使用)。2、是一个Web框架(即MVC具备HTTP能力:可以支持HTTP协议,当我们从前端/浏览器通过ajax(ajax底层是HTTP)发起一个请求时,此时这个MVC就可以直接去响应;

2024-06-07 19:50:11 961

原创 浅谈IDEA中项目如何进行热部署

热部署:当代码修改时,IDEA自动帮忙重新加载项目,无需手动加载。

2024-06-03 15:39:25 502

原创 浅谈SpringBoot日志文件

3、日志信息默认打印在控制台上,但控制台的日志信息不能被保存,那怎么永久将日志信息保存下来??

2024-06-02 20:34:27 985 1

原创 浅谈旧项目如何添加新依赖

点击ok即可添加新的依赖了。

2024-06-02 20:00:50 182

原创 浅谈SpringBoot配置文件

譬如说:有些学校的教务系统不需要去访问第三方智慧树APP来获取学生线上选修课的通过率,他们自己使用自己学校内部开发的APP,那么此时这些学校就不需要在配置文件里配置第三方智慧树APP的秘钥了。因此这个第三方秘钥也可以说是一种用户自定义的配置文件。

2024-06-01 18:58:07 894

原创 浅谈如何解决配置文件.properties 中文乱码问题

properties 配置文件右下角默认是编码 ISO-8859-1。

2024-06-01 14:37:13 309

原创 浅谈网络通信(1)

那么QQ自定义的应用层协议是啥样的?咱们不知道,只有开发者才知道,因此此处QQ自定义的应用层协议我们通过假设进行举例子。假设QQ的应用层协议是这样自定义的:发件人的QQ号、接收人的QQ号、时间、消息内容那么此时就需要将自定义好的应用层协议,

2024-05-26 20:36:42 1119

原创 多线程 —— 锁策略

锁策略,对于需要实现锁的程序员要重点掌握;对于普通的程序员,工作中很少会被要求实现一把锁,但普通的程序员会常常在代码中使用线程进行 “并发编程”,此时就会涉及到多线程,多线程会涉及到线程安全问题,线程安全问题就需要加锁进行解决。因此对于程序员来说,锁策略的知识点也需要掌握好。死锁:即在多线程或者多进程的环境下,两个或多个线程在执行过程中,由于争夺资源而造成的一种相互等待的现象,如果没有外力干涉,这些线程都将无法执行下去。

2024-05-24 11:39:49 645

原创 浅谈如何自我实现一个消息队列服务器(8)——编写客户端部分

6.2、如果响应是针对请求的响应,此时就将响应的payload解析出来,变成 BasicReturns ,根据 BasicReturns 里面的 channelId 在 channelMap里查询对应的 Channel 对象,如果 Channel 对象不存在,说明当前响应对应的客户端并不存在,直接抛异常,如果不为空,就将当前响应存入记录服务器返回响应的哈希表basicReturnsMap里,使用方法 putReturns(basicReturns)处理。(2)、服务器推送给客户端(订阅者)的消息。

2024-05-11 17:16:15 981 2

原创 浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分

再次拿出这张图,前面我们已经将重要概念:VirtualHost、exchange、msgQueue、message、binding 都实现了,此时就可以开始编写消息队列MQ的本体:BrokerServer (服务器),由于消息队列的服务器是一个基于 TCP 协议进行通信的服务器,因此消息队列的 BrokerServer 也叫做 TCP服务器。构造响应对象,设置好响应对象中的值,然后打印 rid、channelId、响应 type、响应 length。方便后续判断当前是哪个连接,连接中的哪一对请求、响应。

2024-05-10 17:13:48 991

原创 多线程典型例子(4)——线程池

由于该线程池类 ThreadPoolExecutor 中的线程数并不是一成不变的,而是根据任务的情况动态变化(自适应),如果任务多,该线程池中的线程数就多一些(创建出来),任务少,该线程池中的线程数就少一些(多余的就销毁),但是此处的动态变化也并不是没有限制,因此ThreadPoolExecutor类的构造方法提供了几个不同含义的参数,来对线程池的动态变化产生一定限制。因此可以使用 线程池,提前创建好一些线程放在线程池中,后续需要使用线程时,直接从线程池中随取随用即可,当线程不再使用时,就放回池子里。

2024-05-09 23:39:39 875

原创 多线程典型例子(2)——单例模式——饿汉模式、懒汉模式

详情

2024-05-07 19:29:32 410

原创 浅谈操作系统中的重要概念——线程(3)——设计模式

设计模式就相当于菜谱,有了菜谱/秘籍,就能够根据菜谱上的指引/步骤做出许多从前不会的美食,就算不会下厨的人,拥有了食谱,他的厨艺也能够得到提升和保障。因此设计模式就是程序员的菜谱,设计模式中介绍了许多典型场景,以及针对这些典型场景的处理办法。按照设计模式来写的代码不会很差,在一定的规范范围里。设计模式有很多种,不止23种,今天主要介绍两种常见、常用的:1、单例模式2、工厂模式工厂,顾名思义是用来生产的。那么对应到我们代码上,工厂模式就是用来生产对象的。那么具体是怎么进行生产对象的呢??

2024-05-07 19:26:49 939

原创 多线程典型例子(3)——定时器

定时器:是日常开发中常见的组件,前端/后端都常用到。类似于一个闹钟:等待一定的时间后,执行某个任务。Java中对于定时器的使用提供了标准库中的Timer类(来自于java.util 包下的类 )。/*** 自我实现一个定时器* 实现思路:* 先描述,后组织。* 1、先要能够将一个任务描述出来* 2、使用一定的数据结构将多个任务 TimerTask 组织起来* 创建一个 TimerTask 这样的类表示要执行的任务,类里表示任务执行的内容,以及任务的实际执行时间。

2024-05-05 21:14:07 112

原创 浅谈操作系统中的重要概念——线程(2)

该篇文章继续重点介绍关于线程的使用,对于Java程序员来说,掌握线程的知识是非常必要的,不仅笔试面试中会用到,实际工作中更会用到。

2024-04-29 20:20:57 625 3

原创 浅谈操作系统中的重要概念——线程(1)

最初是尝试在创建进程时,只给进程分配一个简单的PCB,而不去分配后续进程运行时所需的系统资源,此时这类进程称作——轻量级进程(也叫做 线程 Thread),但是这样的尝试还是出现一个问题:线程创建出来,也是为了到cpu上执行,完成相关任务的。刚创建出来的进程,可以视为是一个只包含一个线程的进程(此时创建的过程需要分配资源,因此此时第一个线程创建的开销就可能比较大,后面再在这个进程里创建的线程,直接服用当前进程的资源,开销就比较小)一个进程中的前台线程都结束了,后台线程还没执行完,也会跟着进程的结束而退出。

2024-04-27 21:22:11 928

原创 浅谈在Java代码中创建线程的多种方式

第一种创建线程的方式就是:自定义一个类,并且使该类继承自Java标准库 Thread 类,此时自定义的类需要重写 run() 方法。注意:重写的 run() 方法,要处理异常时,只能 try {} catch (),并不能 throws,这是因为 Thread 类中的 run() 方法并没有throws xxx这样的设定。重写的 run() 方法里书写的逻辑代码就是我们创建出来的新线程,所要执行的任务。

2024-04-27 21:19:57 840 1

原创 浅谈操作系统中的重要概念——进程

以 .exe 为后缀的可执行文件就是一个程序,一般是存储在硬盘上的。上图中,我们可以看到 QQ.exe 就是一个以.exe 为后缀的可执行文件,因此他就是一个程序,应用程序;图中其他以.exe结尾的文件,其类型也是应用程序。程序在没有双击运行时,是静态的存放在硬盘上的,此时并不会消耗系统资源。正在运行的程序就是进程。譬如说:QQ这个程序没有运行时,以 .exe 作为后缀的文件静态的存放在硬盘上,并没有运行。双击运行时,同一个程序,可以产生多个进程。

2024-04-25 21:34:05 880 1

原创 浅谈 操作系统

操作系统 其实就是一个软件(software)。是一个用来进行管理的软件。进行什么样的管理呢?操作系统一般由 内核 + 配套的程序 组成。内核即一个系统最核心的功能:对下,能够管理好各种硬件设备;对上,能够为各种程序提供稳定的运行环境。

2024-04-25 12:26:21 263 1

原创 浅谈如何自我实现一个消息队列服务器(6)—— 网络通信设计

既然是进行网络通信,那必然既会有 请求,也会有 响应。此处我为了简化项目代码,便将请求、响应 的协议格式设成一致。请求格式:响应格式:接下来来简述一下请求、响应里的3部分,分别是什么意思。type:描述当前 请求 和 响应 分别是干什么的。

2024-04-23 18:46:47 998

原创 浅谈 StringTokenizer 类

最近在编写代码时以及在 牛客、leetcode 上刷题时,有时候会遇到需要对一个字符串进行几部分的截取 这样的需求场景。一般我都是使用 字符串 String 类自带的 split()方法 进行截取字符串,不过由于这个 split()方法 里传入的参数比较特殊,其传入的参数需要是正则表达式。譬如说:当前有个字符串 x = “aaa\tbbb\tccc”,我希望以 \t 为分隔符,将 x 截取,分成好几个字符串子串。

2024-04-21 17:21:26 1016

原创 浅谈 刷算法题时遇到运行超时异常 的解决办法

最近在牛客、leetcode 刷算法题时发现一个奇怪的问题,明明解题思路、所用算法与题解一致,并且在本地IDE运行是通过的,但是在牛客、leetcode 却没办法AC,出现一个叫做 运行超时 的异常。通过查阅资料、反复验证之后,找出了一个有效的解决办法。

2024-04-20 21:09:08 1046

原创 浅谈在 java 中如何从控制台输入一个字符

在 leetcode 上练习算法题时,题目要求输入一个浮点型数值以及一个字符。当我书写Scanner sc = new Scanner(System.in)后,打算通过sc.nextXX实现从控制台输入一个字符时,突然意识到原来Java语法中的Scanner类并没有直接定义读取 char 的方法。由于之前也并没有遇到过需要从控制台输入一个字符的需求场景,因此此时就对如何输入一个字符的问题绞劲脑汁,终于整理出了几种方法,实现从控制台输入字符。

2024-04-19 19:36:42 359

原创 浅谈如何自我实现一个消息队列服务器(5)—— 实现9个核心API中的basicComsume()

1)、自定义一个接口。2)、该接口中只能含有1个方法。3)、该接口必须添加注解 @FunctionInteface 后才能使用此时,我们在 common 包下创建一个 Comsumer 接口,作为我们的 回调方法,同时 Comsumer 回调接口中定义一个 handleDelivery()用来消费消息。

2024-04-10 23:29:28 767

原创 查看MySQL版本的方式

但其实通过连接上mysql客户端服务器的方式去查看 mysql版本的方式,其实有点叫做多此一举,因为当我们输入用户名、密码连接上mysql时,其提示信息已经给出了mysql的版本。这个方法适用于已经成功运行了mysql的童鞋。(注意了,此时的V是个大写的V)

2024-04-05 18:45:23 2831 1

原创 浅谈如何自我实现一个消息队列服务器(4)—— broker server部分使用virtualHost进行整合

因为不同的交换机类型,其转发消息到队列中的转发规则不一样。5)、(获取到队列名之后,查看当前队列是否存在,存在,就构造一个消息对象,再判定一下该消息是否存在,不存在,抛异常,存在,下一步。2)、如果不存在,先对bindingKey进行合法性校验,如果bindingKey不存在,抛异常,如果bindingKey合法,创建Binding对象,然后再判定一下Exchange和MSGQueue是否都存在,如果其一不存在,都需要抛异常,如果存在,3)、判定交换机、队列是否都是持久化,是的话就写硬盘,然后再写内存。

2024-04-03 08:51:18 679

原创 使用IDEA中的 Find Usages

在上述的图片中,我选中了一个方法,右键选择 Find Usages ,点击之后即可看到此方法,究竟被几个地方进行引用。使用IDEA中的 Find Usages ,能够查看某个方法、变量,在哪个地方进行了引用。

2024-04-01 21:18:42 373

原创 浅谈如何自我实现一个消息队列服务器(3)—— 细节分析

在 broker server 运行的过程中,会收到很多消息并进行存储,如果 broker server 重启了,我们就期望将硬盘中之前保存的消息数据还原到内存中,方便 broker server 高效读取数据。咱们这个删除消息的方法中,也必须包含删除哪个队列中的哪个消息这两个重要参数,传入的消息对象参数必须是包含有效的 offsetBeg、offsetEnd 因为后续读取文件中的消息时,需要使用 offsetEnd - offsetBeg 作为 字节数组的容量,表示读取这样大小的消息数据到字节数组中。

2024-03-26 23:06:17 688

原创 浅谈如何自我实现一个消息队列服务器(2)——实现 broker server 服务器

由于在对象中的arguments它的数据类型是Map类型,此时对象中提供的getArguments()方法,其返回值类型是Map类型,当数据库调用这个getter方法时,数据库获取到的是一个Map类型的arguments,由于arguments在数据库中的存储类型是字符串,因此此时数据类型不匹配,获取到的Map类型的arguments无法存入数据库,就会出错。使用逻辑删除衍生出来一个问题:要知道,逻辑删除只是一种标记手段,不是真正的删除,此时就会造成文件越来越大,但是实际里面的有效内容很少。

2024-03-18 22:43:56 1079

原创 浅谈如何自我实现一个消息队列服务器(1)——需求分析

消息队列是将阻塞队列这样的数据结构,单独提取成一个程序,独立部署在一组服务器上。但阻塞队列是在一个进程内部进行的,而消息队列是在进程与进程(服务与服务)之间进行的。如果有同学不知道什么是阻塞队列,点击我前面写的博客多线程的典型例子——阻塞队列进行查漏补缺。1、需要实现 生产者、消费者、broker server 三个部分。2、针对生产者(producer client)和消费者(consumer client)来说,主要编写的是 客户端(client)和服务器(server) 进行网络通信的部分。

2024-03-13 17:04:49 1176

原创 多线程典型例子(1)——阻塞队列

学习了数据结构,我们会接触到队列此数据结构。队列的特点是先进先出。那么如何理解“先进先出”这个概念呢?下图中,右边是一组数:0 1 2 3 4 5 6 7 8,从左至右依次将数字放入队列queue中,再依次将队列中的数字取出来,此时由于0先进队列,因此0也是先出队列的。再举个例子。排队做核酸。先排队的人,就能够先做完核酸,后排队的人,就只能晚点做核酸。队列有许多种类,譬如 优先级队列、消息队列、阻塞队列。此处我们重点介绍阻塞队列。阻塞队列具有队列的一切特点,也是具有先进先出的特点。

2024-03-12 11:08:40 778

原创 浅谈Linux与windows之间文件如何相互下载上传

如果使用rz命令上传文件失败的话,先使用rm+文件名去删除原来目录中的文件,在进行二次上传即可上传成功。因为如果不删除目录中的原文件,上传修改后的同名文件的话,会导致上传不成功。(2)、安装sz、rz命令之后,执行Linux命令: sz+文件名。(2)、安装sz、rz命令之后,执行Linux命令: rz。本地安装Xshell工具之后,连接自己的云服务器。(3)、在弹出的窗口中选择文件存储在本机的位置即可。本地安装Xshell工具之后,连接自己的云服务器。安装sz、rz命令。安装sz、rz命令。

2024-02-27 14:19:42 255

原创 方法parseInt()

parseInt(String x) 将字符串x转成整型。

2024-02-25 22:18:00 70

空空如也

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

TA关注的人

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