后端面经学习自测(二)

文章目录

    • 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:在服务端记录用户的登录信息

  1. 客户端发送http请求,提交用户信息
  2. 服务端保存生成session,并存储在内存
  3. 服务端将sessionId返回给客户端
  4. 客户端将sessionId存储在cookie中
  5. 客户端后续所有请求都需要携带cookie
  6. 服务端通过cookie中的sessionId校验用户信息

**token:**由服务端生成,并发给客户端

img

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);
}

手机验证码登录流程

  1. 客户端输入手机号
  2. 客户端向服务端发送请求,获取手机验证码
  3. 服务端向手机发送验证码
  4. 服务端生成Token,并发送给客户端(验证码+手机号+Token绑定)
  5. 客户端携带【验证码+Token】请求服务端
  6. 服务端校验【验证码+Token】,校验通过后记录用户登录的session信息
  7. 服务端返回登录成功,客户端进行页面跳转

可使用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 实现

  1. 在项目中任何一个模块进行登录,登录后将数据放到两个地方

redis:在key:生成唯一随机值(ip、id等),在value:用户数据

cookie:把redis里面生成的key值放到cookie中

  1. 访问项目中其他模块,发送请求时带着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是线程安全的吗

不安全

  1. JDK1.7 及之前版本,在多线程环境下,HashMap 扩容时会造成死循环和数据丢失的问题
  2. JDK 1.8 后,在 HashMap 中,多个键值对可能会被分配到同一个桶(bucket),并以链表或红黑树的形式存储。多个线程对 HashMap 的 put 操作会导致线程不安全,具体来说会有数据覆盖的风险

补充HashMap和ConcurrentHashMap相关知识

5、Java有没有提供线程安全的结构

ConcurrentHashMap

6、如果用for循环对ArrayList进行元素遍历删除,是否安全?这个不考虑单线程还是多线程

不建议在使用for循环对ArrayList进行元素遍历删除

  1. 删除元素后,ArrayList中元素的索引发生变化,可能会导致某些元素被跳过或重复遍历
  2. 在遍历时修改ArrayList的大小,可能会导致ConcurrentModificationException异常

如果必须使用for循环进行元素遍历删除操作,可以使用迭代器来实现

7、网站对外提供HTTP协议的接口,但是不期望底层异常堆栈信息向客户端暴露,可以如何做

怎么实现?有没有其他方式?

整个项目使用一个统一的异常处理方式

  1. 使用**@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实现

  1. 实现ErrorController接口:可以自定义一个错误控制器来处理应用程序中出现的所有HTTP错误
  2. 使用@ResponseStatus注解:可以在自定义异常类中使用@ResponseStatus注解来指定HTTP错误代码和消息
  3. 使用Servlet的ErrorPage配置:可以在web.xml或通过注解配置中指定一个或多个错误页面来处理应用程序中出现的所有HTTP错误
  4. 使用Spring Boot的ErrorAttributes:可以使用Spring Boot的ErrorAttributes接口来自定义错误响应的内容和格式。

8、想把服务端所有的异常全部拦截掉,在 try catch 的时候应该 catch 什么类型的异常?

Exception

9、error可以被拦截吗

不可以,error是不能处理的错误

10、OOM属于什么类的异常

不可检测异常,运行时异常

img

11、OOM在异常堆栈里是否会暴露程序的一些结构,比如在某一段代码因为什么情况导致OOM

  1. 堆内存溢出:死循环、递归层数太多、内存泄露
  2. 栈内存溢出:单线程调用方法次数太多,递归层数太多
  3. 元空间不足
  4. GC效率太低
  5. 数组大小越界

img

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+树结构是按照索引列的值从小到大排序的,而左模糊匹配的查询条件中,通配符 “%” 出现在了左侧,导致无法按照索引列的值有序查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149533.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

华为云云耀云服务器L实例评测|基于canal缓存自动更新流程 SpringBoot项目应用案例和源码

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 在之前的博客中&#xff0c;介绍过canal的安装和配置&#xff0c;参考博客 拉取创建canal镜像配置相关参数 & …

《Jetpack Compose从入门到实战》第一章 全新的 Android UI 框架

书籍源码 Compose官方文档 《Jetpack Compose从入门到实战》第一章 全新的 Android UI 框架 《Jetpack Compose从入门到实战》 第二章 了解常用UI组件 《Jetpack Compose从入门到实战》第三章 定制 UI 视图 《Jetpack Compose从入门到实战》第八章 Compose页面 导航 《Jet…

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址&#xff1a; GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后&#xff0c;场景视图中有栅格线&#xff0c;这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

JAVA面经整理(8)

一)为什么要有区&#xff0c;段&#xff0c;页&#xff1f; 1)页是内存和磁盘之间交互的基本单位内存中的值修改之后刷到磁盘的时候还是以页为单位的索引结构给程序员提供了高效的索引实现方式&#xff0c;不过索引信息以及数据记录都是记录在文件上面的&#xff0c;确切来说是…

矩阵的c++实现(2)

上一次我们了解了矩阵的运算和如何使用矩阵解决斐波那契数列&#xff0c;这一次我们多看看例题&#xff0c;了解什么情况下用矩阵比较合适。 先看例题 1.洛谷P1939 【模板】矩阵加速&#xff08;数列&#xff09; 模板题应该很简单。 补&#xff1a;1<n<10^9 10^9肯定…

给列起别名(关键字:as)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: select 列名1 as 别名1, 列名2 as 别名2, 列名n as 别名n from 表名; 说明&#xff1a;可以省略as&#xff0c;列名和别名之间使用空格…

MySQL——使用mysqldump备份与恢复数据

目录 1.mysqldump简介 2.mysqldump备份数据 2.1 备份所有数据库 2.2 备份一个/多个数据库 2.3 备份指定库中的指定表 3.mysqldump恢复数据 3.1 恢复数据库 3.2 恢复数据表 1.mysqldump简介 mysqldump命令可以将数据库中指定或所有的库、表导出为SQL脚本。表的结构和表中…

并网逆变器+VSG控制+预同步控制+电流电流双环控制(Simulink仿真实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

火山引擎 ByteHouse:TB 级数据下,如何实现高效、稳定的数据导入

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近期&#xff0c;火山引擎开发者社区、火山引擎数智平台&#xff08;VeDI&#xff09;联合举办以《数智化转型背景下的火山引擎大数据技术揭秘》为主题的线下 Meeup…

做好微信CRM,这些功能你不可不知!

在当前的数字化时代&#xff0c;微信已成为我们日常生活中的重要元素&#xff0c;无论是社交交流、信息传递还是商务合作&#xff0c;微信都扮演着不可或缺的角色。为了更有效地管理微信资源并提高工作效率&#xff0c;很多组织和公司都选择引入微信CRM系统。那么&#xff0c;怎…

【算法学习】-【双指针】-【盛水最多的容器】

LeetCode原题链接&#xff1a;盛水最多的容器 下面是题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第三周测验

课程1_第3周_测验题 目录&#xff1a;目录 第一题 1.以下哪一项是正确的&#xff1f; A. 【  】 a [ 2 ] ( 12 ) a^{[2](12)} a[2](12)是第12层&#xff0c;第2个训练数据的激活向量。 B. 【  】X是一个矩阵&#xff0c;其中每个列都是一个训练示例。 C. 【  】 a 4 […

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…

pandas read_json时ValueError: Expected object or value的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

坦克世界WOT知识图谱三部曲之爬虫篇

文章目录 关于坦克世界1. 爬虫任务2. 获取坦克列表3. 获取坦克具体信息结束语 关于坦克世界 《坦克世界》(World of Tanks, WOT)是我在本科期间玩过的一款战争网游&#xff0c;由Wargaming公司研发。2010年10月30日在俄罗斯首发&#xff0c;2011年4月12日在北美和欧洲推出&…

IDT 一款自动化挖掘未授权访问漏洞的信息收集工具

IDT v1.0 IDT 意为 Interface detection&#xff08;接口探测) 项目地址: https://github.com/cikeroot/IDT/该工具主要的功能是对批量url或者接口进行存活探测&#xff0c;支持浏览器自动打开指定的url&#xff0c;避免手动重复打开网址。只需输入存在批量的url文件即可。 …

Linux删除空目录/非空目录和文件

一、删除目录 删除名为mydir的空目录: rmdir mydir 删除名为mydir的非空目录(非空目录是指该目录包含了其他文件或子目录&#xff0c;而不是空的或没有任何内容的目录) rm -r mydir 删除mydir1下的空目录mydir2 rmdir mydir1/mydir2 删除当前目录下所有以dir一个数字结尾的目录…

Nginx限流熔断

一、Nginx限流熔断 Nginx 是一款流行的反向代理和负载均衡服务器&#xff0c;也可以用于实现服务熔断和限流。通过使用 Nginx 的限流和熔断模块&#xff0c;比如&#xff1a;ngx_http_limit_req_module 和 ngx_http_limit_conn_module&#xff0c;可以在代理层面对服务进行限流…

set和map的封装

目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…

GEE16: 区域日均降水量计算

Precipitation 1. 区域日均降水量计算2. 降水时间序列3. 降水数据年度时间序列对比分析 1. 区域日均降水量计算 今天分析一个计算区域日均降水量的方法&#xff1a; 数据信息&#xff1a;   Climate Hazards Group InfraRed Precipitation with Station data (CHIRPS) is a…