系第一次后端面试记录(答案参考自不同作者,自用,侵删)
文章目录
- 项目相关
- 抽象类和接口的区别?项目中用的哪个?
- JVM、JRE、JDK的区别
- JDK常用的包
- 注解的作用?说几个常用的SpringBoot注解。
- 数据库用的什么?怎么做的JDBC?用的什么框架?
- 非关系型数据库用过吗?
- delete和truncate的区别
- Mysql并发处理?死锁处理?
- 两个spring boot,都有定时任务、要做负载均衡,搭了两个定时任务,只想其中一个任务执行,怎么处理?
- 中间件消息队列用过吗?
- Mysql两个表的关联用过吗?左连接和右链接?where 和 on 的区别?
- 数据库表的记录比较多怎么办?200万的数据?有的应用场景数据量比较大,查询操作比较慢,怎么办?
- Mysql优化相关?怎么看有没有走索引?
- 索引失效的几种情况。
- Java里面的集合用过吗?怎么遍历这些集合呢?有哪些遍历方法?为什么用迭代器?什么情况下用迭代器?
- 线程同步怎么用的?Synchronize用过吗?怎么用的?
- 怎么用wait 和 notify 进行线程通信的。举个例子。
项目相关
前后端分离
传输的数据是什么
- 面预报(图片)
- 灾害预警(二进制流)
- 每日海况(二进制流)
- 重点区域单点预测(post请求,调用后端shell脚本进行预测,传输图片)
怎么进行数据传输的?用的哪个?
前后端分离,采用Restful设计风格。利用Ajaxs。
连接的整个过程
怎么保证安全性
接口的安全性怎么保证的?任何人都可以连接到吗?数据应该比较敏感,怎么预防攻击?如何控制只能单一服务器连接后端服务器。
如何保证API的安全性
参考1 :token、timestamp、sign签名机制、防止重复提交
参考2 :通信使用https、请求签名,防止参数被篡改、身份确认机制,每次请求都要验证是否合法、APP中使用ssl pinning防止抓包操作、对所有请求和响应都进行加解密操作
固定电脑和IP访问:
【NGINX】过滤ip,只允许内网访问
使用401认证机制
使用IP认证机制
使用登录认证机制(验证cookies)
将服务器挪进内网,使用VPN访问
使用RSA token
使用手机令牌或二维码
get和post怎么调试的?get和post的区别
跨域的问题怎么解决的
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。 这里说明一下,无法跨域是浏览器对于用户安全的考虑,如果自己写个没有同源策略的浏览器,完全不用考虑跨域问题了。是浏览器的锅,对。 同源策略限制了一下行为: Cookie、LocalStorage 和 IndexDB 无法读取 DOM 和 JS 对象无法获取 Ajax请求发送不出去。
解决方案:
前端:
- CORS跨域 (前端不用动,后端设置Access-Control-Allow-Origin等)
服务端进行接口请求设置,前端直接调用
说明:后台设置前端某个站点进行访问 - JSONP (动态创建script标签)
JSONP跨域-前端适配,后端配合前后端同时改造 - 接口代理(常用)
通过修改nginx服务器配置实现代理转发
前端修改,后端不用
后端:(SpringBoot)
- @CrossOrigin 注解
- 配置解决:实现 WebMvcConfigurer 接口,重写 addCorsMappings 方法
- 添加过滤器:添加CORS过滤器
用的地图,怎么用的
一般前端:VUE+高德(百度)地图API
序列化和反序列化怎么做的?
图片后端到前端怎么传的?前端有没有别的什么处理?
关于mysql存取图片的三种方式参考
后端:
一般来说,图片在后端的存储方式分为两种:
其一:可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;(前端以流的形式传输到后端存储,并命名保存,然后名字和路径保存在数据库中)
其二:将图片转换成二进制流,直接存储到数据库的 Image 类型字段中。(MongoDB)(MySQL:Method1:采用BLOB数据格式存图片。其实这种方式很不合理,数据库大小会激增会导致简单的查询都及其缓慢。Method2:采用文本格式存储图片。虽然也不怎么合理,因为关系型数据库本身就不太适合存巨长的大数据量的东西。但是由于只涉及到base64加密和解码,且可以都写入后台部分,减轻前端负担。前端以表单形式提交数据信息和图片,后台以MultipartFile类型接收图片,并对图片进行BASE64编码,存储在mysql数据库中。)
前端:
对于第一种存储方式,我们前端直接将存储路径赋值给 src 属性即可轻松显示。
对于第二种存储方式,我们前端需要将其二进制流交由 blob 对象处理,然后通过 blob 的 API 生成临时 URL 赋值给 src 属性来显示。(前端显示图片有三种方式:url、base64、blob,这三者之间可以互相转化)
从后端返回的二进制流图片,直接接受打印的话,会乱码。axios 默认返回的是 json 文本形式,二进制图片数据被强制转换成了 json 文本形式。找到了原因,解决方案就好办了。我们在 axios 里面,responseType 默认返回数据类型是 json,将其改为返回数据类型 blob。
前端图片处理:vue+element-ui中的图片获取与上传(参考)
前后端交互怎么做的?
前后端定时和实时推送的东西
- spring boot进行定时任务一共有三种方式,第一种也就是最简单的一种:基于注解 (@Scheduled)的方式;第二种:基于接口 (SchedulingConfigurer);第三种:基于注解设定多线程定时任务。
- SpringBoot2.0整合WebSocket,实现后端数据实时推送
抽象类和接口的区别?项目中用的哪个?
JVM、JRE、JDK的区别
JDK常用的包
java.io包、java.lang包、java.math包、java.net、java.nio、java.util
注解的作用?说几个常用的SpringBoot注解。
注解本身不提供作用,注解只能是被看作元数据,它不包含任何业务逻辑。注解更像是一个标签,一个声明,表面被注释的这个地方,将具有某种特定的逻辑。常见的注解有三大类:JDK的,自定义的,第三方的(比如框架)。
因为注解大多都有自己的配置参数,而配置参数以名值对的方式出现,所以从某种角度来说,可以把注解看成是一个XML元素,该元素可以有不同的预定义的属性。而属性的值是可以在声明该元素的时候自行指定的。在代码中使用注解,就相当于把一部分元数据从XML文件移到了代码本身之中,在一个地方管理和维护。
数据库用的什么?怎么做的JDBC?用的什么框架?
spring-boot-starter-jdbc、使用druid数据源。整合Mybatis。
非关系型数据库用过吗?
Redis、MongoDB。
delete和truncate的区别
Mysql并发处理?死锁处理?
MySQL并发更新数据时的处理方法:
MySQL死锁
当两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现该行已经被对方锁定,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,则陷入死循环。触发了死锁。
InnoDB 死锁检测
Innodb提供了wait-for graph算法来主动进行死锁检测,在每个事务请求锁并发生等到的时候都会判断是存在回路,若存在则有死锁。通常来说InnoDB选择回滚undo量最小的事务
参考
两个spring boot,都有定时任务、要做负载均衡,搭了两个定时任务,只想其中一个任务执行,怎么处理?
中间件消息队列用过吗?
Mysql两个表的关联用过吗?左连接和右链接?where 和 on 的区别?
数据库表的记录比较多怎么办?200万的数据?有的应用场景数据量比较大,查询操作比较慢,怎么办?
使用索引、优化 SQL 语句、优化数据库对象(优化表的数据类型、对表进行拆分)、使用数据库连接池、使用查询缓存、主从复制, 读写分离, 负载均衡、数据库分表, 分区, 分库。
参考
Mysql优化相关?怎么看有没有走索引?
索引失效的几种情况。
Java里面的集合用过吗?怎么遍历这些集合呢?有哪些遍历方法?为什么用迭代器?什么情况下用迭代器?
- 遍历方法:普通for、for each、iterator 、lambda、Stream API。
- 在对集合进行遍历删除的时候应使用迭代器Iterator 从源集合安全的删除对象,这样可以避免出现ConcurrentModifiedException;
《阿里巴巴 Java 开发手册》的描述如下:不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
线程同步怎么用的?Synchronize用过吗?怎么用的?
- synchronized、lock锁 参考
怎么用wait 和 notify 进行线程通信的。举个例子。
交替执行
参考