后端面经学习自测(二)
文章目录
- 1、Http1.1和2.0的区别大概是什么?
- HTTP & HTTPS
- 2、HTTP,用户后续的操作,服务端如何知道属于同一个用户
- cookie & session & token
- 手机验证码登录流程
- SSO单点登录
- 3、如果服务端是一个集群机器?
- 4、hashmap是线程安全的吗
- 5、Java有没有提供线程安全的结构
- 6、如果用for循环对ArrayList进行元素遍历删除,是否安全?这个不考虑单线程还是多线程
- 7、网站对外提供HTTP协议的接口,但是不期望底层异常堆栈信息向客户端暴露,可以如何做
- 8、想把服务端所有的异常全部拦截掉,在 try catch 的时候应该 catch 什么类型的异常?
- 9、error可以被拦截吗
- 10、OOM属于什么类的异常
- 11、OOM在异常堆栈里是否会暴露程序的一些结构,比如在某一段代码因为什么情况导致OOM
- 12、Java的双亲委派机制了解吗
- 13、想破除双亲委派机制,一般以什么方式
- 14、如果一个线程执行里面赋值比较耗时,不知道耗时多久,还想打印赋值的正确结果,有没有其他方式
- 15、String a = new String("ABC");内存结构?
- 16、Spring了解多少?
- 17、Spring的事务标签有没有用过?什么场景会生效
- 18、mysql现在有一个联合索引a,b,c,有一个where条件是b=XX查询,索引会失效吗
- 19、描述一下最左匹配原则
- 20、where条件等于b符合最左原则吗?等于a符合吗
- 21、查询a LIKE一个String前缀,能走索引吗
1、Http1.1和2.0的区别大概是什么?
HTTP1.1
1、无状态、明文传输,不安全
2、长连接,超时服务端主动断开
3、管道传输,减小响应时间
问题:没有解决响应的队头阻塞
HTTP2.0
1、头部压缩:多个请求,头部相似,会消除重复部分
2、二进制格式:头部信息和数据信息都采用二进制格式,头部帧、数据帧,增加数据传输效率
3、并发传输:使用Stream ID来区分不同的HTTP请求,通过多路复用一条tcp连接,实现了http并发传输的效果,性能比http1.1高了很多
4、服务器主动推送资源
问题:一旦发生丢包,就会阻塞住所有的 HTTP 请求
HTTP3.0
基于 UDP 的 QUIC 协议
- 无队头阻塞:当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响
- 更快的连接建立:QUIC 协议握手只需要1RTT,目的是为确认双方的连接 ID
- 连接迁移
基于TCP的HTTP协议:四元组(源 IP、源端口、目的 IP、目的端口)
QUIC 协议:通过连接 ID 来标记通信的两个端点
HTTP & HTTPS
HTTP
1、超文本传输协议,明文传输,不安全
2、连接简单,TCP三次握手后即可进行传输
3、端口:80
HTTPS
1、引入SSL/TLS安全协议(传输层和网络层之间),加密传输
2、不仅需要TCP三次握手,还需要SSL/TLS握手过程
3、端口:443
4、需要向CA申请数字证书
2、HTTP,用户后续的操作,服务端如何知道属于同一个用户
HTTP是无状态协议,可通过cookie、session保存用户状态,cookie是在客户端存储,session是在服务端存储
cookie & session & token
cookie:服务端收到HTTP请求,在**浏览器(客户端)**的响应头中添加cookie信息(保存sessionId或token),用于保存用户登录信息
客户端每发一次新请求,浏览器都会将之前保存的cookie信息通过cookie请求头再发给服务器,此时浏览器发出之后,就有可能被拦截,不安全
session:在服务端记录用户的登录信息
- 客户端发送http请求,提交用户信息
- 服务端保存生成session,并存储在内存
- 服务端将sessionId返回给客户端
- 客户端将sessionId存储在cookie中
- 客户端后续所有请求都需要携带cookie
- 服务端通过cookie中的sessionId校验用户信息
**token:**由服务端生成,并发给客户端
token:客户端发起登录请求,服务端验证通过后,生成全局唯一Token,绑定用户信息(value),并将Token作为key存入Redis中
多端登录:(secretId:客户端的唯一标识)
- token
- token+secretId
- token+secretId+userId
使用Token获取用户信息
1、根据request获取userId
2、根据userId获取用户信息
// 根据token获取用户信息
@GetMapping("getMemberInfo")
public R getMemberInfo(HttpServletRequest request) {// 调用jwt工具类方法,根据request对象,获取头信息,返回用户idString memberId = JwtUtils.getMemberIdByJwtToken(request);// 查询数据库,根据用户id,获取用户信息UcenterMember member = memberService.getById(memberId);return R.ok().data("userInfo", member);
}
手机验证码登录流程
- 客户端输入手机号
- 客户端向服务端发送请求,获取手机验证码
- 服务端向手机发送验证码
- 服务端生成Token,并发送给客户端(验证码+手机号+Token绑定)
- 客户端携带【验证码+Token】请求服务端
- 服务端校验【验证码+Token】,校验通过后记录用户登录的session信息
- 服务端返回登录成功,客户端进行页面跳转
可使用Redis设置验证码5分钟有效时间
@RestController
@CrossOrigin
@RequestMapping("/edumsm/msm")
public class MsmController {@Autowiredprivate MsmService msmService;@Autowiredprivate RedisTemplate<String, String> redisTemplate;// 发送短信@GetMapping("send/{phone}")public R sendMsm(@PathVariable String phone) {// 1. 先从redis中获取验证码,如果能获取直接返回String code = redisTemplate.opsForValue().get(phone);if (! StringUtils.isEmpty(code)) {return R.ok();}// 2. 如果获取不到,再进行阿里云发送// 生成随机的值,传递给阿里云发送code = RandomUtil.getFourBitRandom();Map<String, Object> param = new HashMap<>();param.put("code", code);// 调用service发送短信的方法boolean isSend = msmService.send(param, phone);if (isSend) {// 发送成功,把发送成功验证码放到redis里,并设置有效时间redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);return R.ok();} else {return R.error().message("短信发送失败");}}
}
SSO单点登录
只需要登录一次,即可访问互相信任的系统
三种常见方式
1、session广播机制实现(基本不用了)
session复制
2、使用cookie+redis 实现
- 在项目中任何一个模块进行登录,登录后将数据放到两个地方
redis:在key:生成唯一随机值(ip、id等),在value:用户数据
cookie:把redis里面生成的key值放到cookie中
- 访问项目中其他模块,发送请求时带着cookie进行发送,获取cookie值后,把获取到的cookie值放入redis进行查询,根据key查询,如果能查到数据,就是登录
3、使用token实现
令牌
token:按照一定的规则生成字符串,字符串可以包含用户信息
1.在项目某个模块进行登录,登录之后,按照规则生成字符串,将用户信息包含在字符串里,最后返回字符串
- 把字符串通过cookie返回
- 把字符串通过地址栏返回
2.再访问项目其他模块,每次访问在地址栏带着生成的字符串,在访问模块里获取地址栏字符串,根据字符串获取用户信息。如果可以获取到,就是登录
session默认过期时间:30min
session、redis、token都可以设置过期时间
JWT令牌:按照规定好的规则,使用JWT可以直接生成字符串,包含用户信息(JWT头+用户信息+签名哈希)
3、如果服务端是一个集群机器?
对于集群,如果 session 保存在其中一台机器上,就会涉及到数据不一致的问题,可以使用MySQL或Redis来存储用户信息
常用:基于redis实现共享session登录
4、hashmap是线程安全的吗
不安全
- JDK1.7 及之前版本,在多线程环境下,HashMap 扩容时会造成死循环和数据丢失的问题
- JDK 1.8 后,在 HashMap 中,多个键值对可能会被分配到同一个桶(bucket),并以链表或红黑树的形式存储。多个线程对 HashMap 的 put 操作会导致线程不安全,具体来说会有数据覆盖的风险
补充HashMap和ConcurrentHashMap相关知识
5、Java有没有提供线程安全的结构
ConcurrentHashMap
6、如果用for循环对ArrayList进行元素遍历删除,是否安全?这个不考虑单线程还是多线程
不建议在使用for循环对ArrayList进行元素遍历删除
- 删除元素后,ArrayList中元素的索引发生变化,可能会导致某些元素被跳过或重复遍历
- 在遍历时修改ArrayList的大小,可能会导致ConcurrentModificationException异常
如果必须使用for循环进行元素遍历删除操作,可以使用迭代器来实现
7、网站对外提供HTTP协议的接口,但是不期望底层异常堆栈信息向客户端暴露,可以如何做
怎么实现?有没有其他方式?
整个项目使用一个统一的异常处理方式
- 使用**@ControllerAdvice** 注解:可以定义一个类,在该类中使用**@ExceptionHandler**注解来处理控制器中抛出的异常
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {@ExceptionHandler(BaseException.class)public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) {//......}@ExceptionHandler(value = ResourceNotFoundException.class)public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {//......}
}
@ControllerAdvice:aop思想的一种实现,你告诉我需要拦截规则,我帮你把他们拦下来,具体你想做更细致的拦截筛选和拦截之后的处理,你自己通过@ExceptionHandler实现
- 实现ErrorController接口:可以自定义一个错误控制器来处理应用程序中出现的所有HTTP错误
- 使用@ResponseStatus注解:可以在自定义异常类中使用@ResponseStatus注解来指定HTTP错误代码和消息
- 使用Servlet的ErrorPage配置:可以在web.xml或通过注解配置中指定一个或多个错误页面来处理应用程序中出现的所有HTTP错误
- 使用Spring Boot的ErrorAttributes:可以使用Spring Boot的ErrorAttributes接口来自定义错误响应的内容和格式。
8、想把服务端所有的异常全部拦截掉,在 try catch 的时候应该 catch 什么类型的异常?
Exception
9、error可以被拦截吗
不可以,error是不能处理的错误
10、OOM属于什么类的异常
不可检测异常,运行时异常
11、OOM在异常堆栈里是否会暴露程序的一些结构,比如在某一段代码因为什么情况导致OOM
- 堆内存溢出:死循环、递归层数太多、内存泄露
- 栈内存溢出:单线程调用方法次数太多,递归层数太多
- 元空间不足
- GC效率太低
- 数组大小越界
12、Java的双亲委派机制了解吗
类加载时,先判断当前类是否被加载过,已加载直接返回,否则才尝试加载
加载首先会把请求委派给父类加载器的loadClass()处理,即传送到顶层的启动类加载器 BootstrapClassLoader 。父类加载器无法处理时才自己处理。父类加载器为null,使用启动类加载器作为父类加载器
13、想破除双亲委派机制,一般以什么方式
自定义加载器,需要继承 ClassLoader,重写 ClassLoader 类中的 findClass() 方法即可,无法被父类加载器加载的类最终会通过这个方法被加载
14、如果一个线程执行里面赋值比较耗时,不知道耗时多久,还想打印赋值的正确结果,有没有其他方式
不知道执行多久就用join,主线程等待子线程结束之后再执行,这个时候不需要sleep,直接 join 的话,返回的就一定是子线程执行完毕的结果了
15、String a = new String(“ABC”);内存结构?
String a在堆中,“ABC”在字符串常量池中
补充String相关知识
16、Spring了解多少?
17、Spring的事务标签有没有用过?什么场景会生效
18、mysql现在有一个联合索引a,b,c,有一个where条件是b=XX查询,索引会失效吗
不会,最左匹配原则
索引失效:
1、使用左、左右模糊查询 like %xx,like %xx%
2、对索引列做计算、函数、类型转换操作
3、联合索引未遵循最左匹配原则
4、WHERE子句中,ON前是索引列,ON后不是索引列
19、描述一下最左匹配原则
假设有一个(a, b, c)联合索引,它的存储顺序是先按 a 排序,在 a 相同的情况再按 b 排序,在 b 相同的情况再按 c 排序
- 联合索引从最左边的列开始匹配,如果查询条件没有使用到某个列,那么该列右边的所有列都无法走索引
- 如果查询条件使用了某个列,且该列的值包含范围查询,那么范围查询的字段可以走索引,范围查询后面的字段无法走索引
20、where条件等于b符合最左原则吗?等于a符合吗
等于b不符合,等于a符合
21、查询a LIKE一个String前缀,能走索引吗
不能,因为索引的 B+树结构是按照索引列的值从小到大排序的,而左模糊匹配的查询条件中,通配符 “%” 出现在了左侧,导致无法按照索引列的值有序查找
相关文章:
后端面经学习自测(二)
文章目录 1、Http1.1和2.0的区别大概是什么?HTTP & HTTPS 2、HTTP,用户后续的操作,服务端如何知道属于同一个用户cookie & session & token手机验证码登录流程SSO单点登录 3、如果服务端是一个集群机器?4、hashmap是线…...
使用Jest测试Cesium源码
使用Jest测试Cesium源码 介绍环境Cesium安装Jest安装Jest模块包安装babel安装Jest的VSC插件 测试例子小结 介绍 在使用Cesium时,我们常常需要编写自己的业务代码,其中需要引用Cesium的源码,这样方便调试。此外,目前代码中直接使用…...
buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce
用dirsearch扫一下,看到flag.php 访问一下没啥东西,使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn/.git/查看index.php <?php include "flag.php"; echo "flag在哪里呢?…...
【逐步剖C】-第十一章-动态内存管理
一、为什么要有动态内存管理 从我们平常的学习经历来看,所开辟的数组一般都为固定长度大小的数组;但从很多现实需求来看需要我们开辟一个长度“可变”的数组,即这个数组的大小不能在建立数组时就指定,需要根据某个变量作为标准。…...
【树】树的直径和重心
目录 一.树的直径 (1)定义 (2)思路 (3)例题 (4)std(第一小问) 二.树的重心 (1)介绍 (2)求重心 (3)例…...
《Attention Is All You Need》论文笔记
下面是对《Attention Is All You Need》这篇论文的浅读。 参考文献: 李沐论文带读 HarvardNLP 《哈工大基于预训练模型的方法》 下面是对这篇论文的初步概览: 对Seq2Seq模型、Transformer的概括: 下面是蒟蒻在阅读完这篇论文后做的一…...
C++笔记之不同buffer数量下的生产者-消费者机制
C笔记之不同buffer数量下的生产者-消费者机制 文章目录 C笔记之不同buffer数量下的生产者-消费者机制0.在不同的缓冲区数量下,生产者-消费者机制的实现方式和行为的区别1.最简单的生产者-消费者实现:抄自 https://mp.weixin.qq.com/s/G1lHNcbYU1lUlfugXn…...
编码文字使用整数xyz 三个坐标 并使用
导航 说明原始描述AI理解的实现代码说明 原始描述 而后期的,相同的s,前缀差距 和 自身权重 要对应的上,或者说 假设每个序列都是三维空间上的点集合,使用最小的空间表达这些信息,整个数据集才是重点。这些点的集合可以 是空间直线或者是曲线 整体的思路是 一个集合能在任…...
创建vue3工程
一、新建工程目录E:\vue\projectCode\npm-demo用Visual Studio Code 打开目录 二、点击新建文件夹按钮,新建vue3-01-core文件夹 三、右键vue3-01-core文件夹点击在集成终端中打开 四、初始化项目,输入npm init 一直敲回车直到创建成功如下图 npm init 五…...
Flutter笔记 - 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类
Flutter笔记 用于描述Align的Alignment、AlignmentDirectional、AlignmentTween类 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_…...
门面模式简介
门面模式简介 门面模式(Facade Pattern)是一种结构性设计模式,它提供了一个简化复杂系统的接口,允许客户端通过一个统一的接口与系统交互,而不需要了解系统内部的复杂性。这个模式的目标是降低客户端与系统之间的耦合…...
2023年7月工作经历二
invoke的翻译 C#的这个关键字很熟,但不知道如何翻译比较好。和网友沟通,并查阅多篇博文,觉得“同步调用(invoke)和异步调用(beginvoke)”比较好。 VS2022很爽 C#的类名,会提示命名空间。C调试的时候&…...
7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展
一。项目运行步骤与运行细节 1.项目运行步骤(一定有其他的运行方式,我这里只提供一种我现在使用的编译方式) (1)项目运行使用软件与技术: 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…...
学习开发一个RISC-V上的操作系统(汪辰老师) — unrecognized opcode `csrr t0,mhartid‘报错问题
前言 (1)此系列文章是跟着汪辰老师的RISC-V课程所记录的学习笔记。 (2)该课程相关代码gitee链接; (3)PLCT实验室实习生长期招聘:招聘信息链接 正文 (1)在跟着…...
【计算机网络】 心跳机制
文章目录 心跳机制应用场景什么是心跳机制心跳包的发送,通常有两种技术 心跳机制 应用场景 在长连接下,有可能很长一段时间没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故…...
文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
四、用go语言,重写 ENQUEUE 和 DEQUEUE 的代码,使之能处理队列的下溢和上溢。 文心一言: 在 Go 语言中,我们可以使用切片来实现队列。下面是如何实现 ENQUEUE 和 DEQUEUE 操作,同时处理队列的下溢和上溢的情况&#…...
进程调度算法之时间片轮转调度(RR),优先级调度以及多级反馈队列调度
1.时间片轮转调度算法(RR) round Robin 1.算法思想 公平地、轮流地为各个进程服务,让每个进程在一定时间间隔内都可以得到响应。 2.算法规则 按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片(如100ms)。 若进程未…...
ARMv8如何读取cache line中MESI 状态以及Tag信息(tag RAM dirty RAM)并以Cortex-A55示例
Cortex-A55 MESI 状态获取 一,系统寄存器以及读写指令二,Cortex-A55 Data cache的MESI信息获取(AARCH 64)2.1 将Set/way信息写入Data Cache Tag Read Operation Register2.2 读取Data Register 1和Data Register 0数据并解码 参考…...
密码技术 (6) - 证书
一. 前言 前面介绍的公钥密码和数字签名,都无法解决一个问题,那就是判断自己获取的公钥是否期望的,不能确定公钥是否被中间攻击人掉包。所以,证书的作用是用来证明公钥是否合法的。本文介绍的证书就是解决证书的可靠性的技术。 二…...
【算法学习】-【双指针】-【盛水最多的容器】
LeetCode原题链接:盛水最多的容器 下面是题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。…...
JAVA面经整理(8)
一)为什么要有区,段,页? 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式,不过索引信息以及数据记录都是记录在文件上面的,确切来说是…...
【Java 进阶篇】JDBC数据库连接池Druid详解
在Java应用程序中,与数据库进行交互是一个常见的任务。为了更有效地管理数据库连接并提高性能,数据库连接池是一种常见的解决方案。Druid是一个流行的JDBC数据库连接池,它具有丰富的功能和高性能。本博客将详细介绍Druid连接池,包…...
Linux——指令初识
Linux下基本指令 前言一、 ls 指令二、 pwd命令三、cd 指令四、 touch指令五、mkdir指令六、rmdir指令 && rm 指令七、man指令八、cp指令九、mv指令十、cat指令十一、.more指令十二、less指令十三、head指令十四、tail指令总结 前言 linux的学习开始啦! 今…...
专题一:双指针【优选算法】
双指针应用场景: 数组划分、数组分块 目录 一、移动0 二、复写0 从后向前 三、快乐数 链表带环 四、盛水最多的容器 单调性双指针 五、有效三角形个数 单调性双指针 六、和为s的两个数字 七、三数之和 细节多 需再练 一、移动0 class Solution { public:void move…...
蓝桥等考Python组别十二级007
第一部分:选择题 1、Python L12 (15分) 运行下面程序,输出的结果是( )。 lis = [A, B, C, D, E, F] print(lis[0 : 3]) [A, B, C][A, B][A, B, C, D][B, C, D]正确答案:A 2...
全方位介绍工厂的MES质量检验管理系统
一、MES质量检验管理系统的定义: MES质量检验管理系统是基于制造执行系统的框架和功能,专注于产品质量的控制和管理。它通过整合和优化质量检验流程,提供实时的数据采集、分析和反馈,帮助工厂实现高效的质量管理。该系统涵盖了从…...
避免风险,亚马逊、沃尔玛、阿里国际站选择什么样的测评方式最安全?
亚马逊、沃尔玛、速卖通、阿里国际站上做测评是最有效的推广手段之一,而测评又存在很大的风险。但是测评的风险来自哪里?什么样的测评方式才安全呢? 因为平台大数据风控点很多,根据洪哥六七年的测评经验,风控包括以下…...
【C语言】语法--联合体union详解
本文参考博客: https://blog.csdn.net/m0_57180439/article/details/120417270 定义及示例: 联合是一种特殊的自定义类型,该种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合体也被称为共用体。 #include<stdio.h> union Un//联合类型…...
接口测试复习
一。基本概念 接口概念:系统与系统之间 数据交互的通道。 接⼝测试概念:校验 预期结果 与 实际结果 是否⼀致。 特征: 测试⻚⾯测试发现不了的问题。(因为:接⼝测试 绕过前端界⾯。 ) 符合质量控制前移理…...
获取医疗器械板块的个股列表
获取医疗器械板块的个股列表,用python爬虫做到(数据网址:板块 - 医疗器械概念 - 股票行情中心 - 搜狐证券) import requests from bs4 import BeautifulSoup # 获取医疗器械概念个股列表url "https://q.stock.sohu.com/cn/…...
电子商务烟台网站建设/爱站长
一、 控制hive任务中的map数:1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命…...
简述网站的推广策略/宁波企业网站seo
原因:1,coroutine容易与正常的generators弄混2,一个function是否为coroutine由函数体内是否有yield 或者yield from 决定,这不科学。3,如果在语法上允许yield的地方才能进行异步调用,那诸如with和for语句中…...
可以免费推广的网站/焦作关键词优化排名
https://developer.mozilla.org/en-US/docs/Plugins转载于:https://www.cnblogs.com/anyboo/p/3196453.html...
基于jquery做的网站/市场营销说白了就是干什么的
数组定义、特点、运算符:算术运算 --(自减 自加) 赋值运算发 比较:! 逻辑运算 有 && || ! 正则表达式 修饰符 i:用来表示 g:很少演示(在第一行使用) m&#x…...
寻找专业网站建设/简述获得友情链接的途径
js定时器关闭,一次关闭所有正在运行的定时器,自定义函数clearIntervals()一次关闭所有正在运行的定时器,原理:利用数组存储定时器id,然后遍历数组,关闭定时器附上页面的截图,代码在截图下&#…...
在网站接入银联怎么做/百度平台客服电话
最近感觉网购的效率很不错,前几天在网上买的书三天就到了。哈哈。这下晚上回家有书看了。一次搞了三本书。 消化中。。。。 PS:买的耳机也不错。同事还让帮忙也买了一个,22块的耳机。HOHO,音质还可以 转载于:https://www.cnblogs.…...