最近开始找工作了,坐标杭州。渣渣感觉面试应该挺困难的,也不知道具体会问哪些类型,会在面试完把每一次面试问到的题目列出来, 一个作用是参考记录,另一个作用是可以把自己不会或者弱项的问题及时补齐。
暂时是先把问题列出来,有时间的时候会把答案补上。
希望能找到一个好工作,加油
尼尧的面试日记:面试记录(二)
- 本次面试过程
- 面试题
- 1、之前主要是负责项目中哪一块?
- 2、为什么离开上一家公司。来我们公司有什么目标?
- 3、我看你SpringMvc、SpringBoot都用过,说说为什么要用SpringBoot。
- 4、说说你常用的设计模式是哪些?
- 5、你们项目中都在哪用到了redis缓存,基于什么考虑的。
- 6、数据库怎么连接的,连接密码明文配置的吗?
- 7、你们项目数据量你有统计过吗?量级是多少?
- 8、sql优化知道吗,怎么做?
- 9、看你们数据量应该也不大吧,分库分表操作过吗?
- 10、平常数据库表是自己建的么,操作数据库有权限限制吗?
- 11、Sql注入知道吗,怎么解决的?
- 12、说说mq,说说现在主流的mq你用过的,他们的区别是什么。
- 13、看你用过kafka,说说使用场景。
- 14、你们项目在哪用到了mq,怎么用的。
- 15、mq重复消费怎么办,怎么解决的?
- 16、说说并发吧,你们项目在哪里用到了并发。
- 17、死锁情况遇到过吗,怎么解决的?
- 18、说一说SpringCloud吧,全家桶里都有什么组件。
- 19、SpringCloud,或者说微服务之间是怎么调用的你知道吗?
- 20、你们之前的系统规模大么,分布式怎么部署的,互相之间怎么调用的。RPC知道吗?
- 21、看你有一些前端、H5经验,你们公司之前怎么开发的H5?
- 22、前端都会哪些,Jquery比较熟是吧,那说说选择器。
- 23、你们之前的项目安全方面涉及多吗,怎么做的。
- 24、知道重放攻击吗,怎么解决?
- 25、你们项目中怎么操作文件的,用的什么(大概问的是BIO/NIO)?
- 26、你们还在用JDK1.8是吧,知道java新特性吗,比如8的新特性有哪些?
- 27、知道为什么JDK现在都有12甚至14了,8却屹立不倒的原因吗?
- 28、你有什么想问的吗?
我大概总结一下,小型公司2年以下开发主要业务就是CRUD,招人肯定是希望能立马上手,所以面试范围我押题是常用的框架(SpringBoot、Spring基本概念,Mybatis),事务、数据库相关(锁、事务级别、sql优化,数据库底层概念等)、异常。有些会问一些设计模式(主要掌握工厂模式、单例模式、代理模式。)。
中大型公司的话,加上 JVM,集合,并发编程,一些网络知识。有些可能还会有一两道算法题。甚至开始问分布式了,具体看他们业务。
大厂请直接参考我画的java路线图,大厂知识路线没有3年以下之分,只有深/广度之分:Java知识体系脑图(2020年)
本次面试过程
- 背景
中型公司,安防类。据说是新成立的业务线,缺人,主要做安防类相应的APP。 现场面试,基本上就是围绕简历问了相关技术点,以及掌握的深度。
- 过程
本次就一轮面试,一开始也是自我介绍,然后就围绕简历问了一些问题。
面试题
1、之前主要是负责项目中哪一块?
略
2、为什么离开上一家公司。来我们公司有什么目标?
上一家公司与个人发展不符。阿巴阿巴阿巴 此处自己考虑,
3、我看你SpringMvc、SpringBoot都用过,说说为什么要用SpringBoot。
SpringBoot是基于SpringMvc进行优化的,它的核心概念就是“约定大于配置”,在启动器中,将很多需要使用到的包以及需要配置的xml文件进行整合了,而约定大于配置的最重要的体现是在于自动配置,主启动类默认扫描启动与之同级别目录下的文件,因此文件创建的位置比较固定。而SpringBoot也因为这个特性相较于SpringMvc更简单易用,少了很多繁琐的xml配置文件。
4、说说你常用的设计模式是哪些?
5、你们项目中都在哪用到了redis缓存,基于什么考虑的。
缓存即把数据库的数据先读出来,存储在Redis等Nosql中,并设置一定的过期时间,当再次需要该数据时,先从速度较快的Nosql缓存数据中取,提高效率,减少DB层的压力。
用缓存,主要有两个用途:高性能、高并发。
缓存一般都是存储读多写少的数据;或者是需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求;还有就是一些访问频率高的热点数据,这些数据更新时也要及时更新到数据库。缓存这些数据可以提高系统的性能。
数据库并发量有限,可以依靠缓存提高并发性能,Nosql能支持的并发量比数据库有高得多。
读多写少的数据就比如用户拥有的权限,或者一些不怎么变化的数据,用户的个人基本信息啊,已完成只能查询的业务表单数据啊。用户日常主要业务一般就是热点数据了,这些数据也可以全都存到缓存里,但是为了保证数据一致性,更改的数据要及时更新到缓存里。
6、数据库怎么连接的,连接密码明文配置的吗?
使用Mybatis连接,设置相应的参数,实际上底层是调用的Jdbc嘛,首先也是先获得驱动,然后再根据数据库地址、密码进行连接。
我们公司用的md5加密,忘了具体为什么用MD5加密了。
7、你们项目数据量你有统计过吗?量级是多少?
没有统计过,量级不是很大。 (尬)
8、sql优化知道吗,怎么做?
量级比较小的,首先肯定是先优化查询语句,提高查询效率。量级大一些的就会使用索引来进行优化。
再大就要分库分表了。
9、看你们数据量应该也不大吧,分库分表操作过吗?
没有。(尬,后期补上)
10、平常数据库表是自己建的么,操作数据库有权限限制吗?
有些是自己建的,但前提是这一块是自己全部负责开发的才会这样。大多数时候编写接口时,只能用方法调用操作,并不会直接开放数据库,我们组之前有个数据库比较强的,基本上由他来负责管理数据库,也会根据每个人的业务创建用户来控制权限。
11、Sql注入知道吗,怎么解决的?
Sql注入就是未经检查或者未经充分检查的用户输入数据,意外变成了代码被执行。进入数据库最终执行的Sql语句被恶意拼接导致了预期外的结果,轻则跳过用户信息验证进行登录,重则删表删库、泄露数据。
Sql注入出现的原因是运行时编译。
大多数时候Sql注入都是由于程序员的疏忽,没有对Sql语句进行过滤和判断,让额外的字符串进入DB层面。现在的数据库系统都提供SQL语句的预编译(prepare)和查询参数绑定功能,可以解决Sql注入。
解决办法:
主要是杜绝Sql拼接的情况。
1、对接收到的参数进行验证,检测Sql常见关键字,如or and drop之类的。
2、后端在代码中对参数进行过滤,使用正则表达式过滤传入的参数、字符串。
3、无论是直接使用数据库还是使用如mybatis组件,使用sql的预编译,不要用拼接字符串。
- 在JDBC中,使用Statement的子类PreparedStatement,参数使用?占位符传入,由于PreparedStatement已将语句提前进行预编译,传入的带注入的参数就得不到编译了。
- Mybatis中尽量使用#{}而不是${},#{}就像是JDBC中的?。
12、说说mq,说说现在主流的mq你用过的,他们的区别是什么。
13、看你用过kafka,说说使用场景。
14、你们项目在哪用到了mq,怎么用的。
15、mq重复消费怎么办,怎么解决的?
16、说说并发吧,你们项目在哪里用到了并发。
17、死锁情况遇到过吗,怎么解决的?
18、说一说SpringCloud吧,全家桶里都有什么组件。
19、SpringCloud,或者说微服务之间是怎么调用的你知道吗?
20、你们之前的系统规模大么,分布式怎么部署的,互相之间怎么调用的。RPC知道吗?
21、看你有一些前端、H5经验,你们公司之前怎么开发的H5?
22、前端都会哪些,Jquery比较熟是吧,那说说选择器。
23、你们之前的项目安全方面涉及多吗,怎么做的。
24、知道重放攻击吗,怎么解决?
重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。
简单来说,就是把你的请求原封不动地再发送一次,两次…n次,重放攻击是二次请求。黑客可以通过抓包获取到了请求的HTTP报文,然后黑客自己编写了一个类似的HTTP请求,发送给服务器,可以通过此方法进行攻击。
重放攻击的防御方案
- 1、基于timestamp方案
每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。
- 2、基于nonce方案
nonce是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关。我们将每次请求的nonce参数存储到一个redis中。 每次处理HTTP请求时,首先判断该请求的nonce参数是否在redis中,如果存在则认为是非法请求。
- 3、基于timestamp+nonce方案
我们常用的防止重放的机制是使用timestamp和nonce来做的重放机制。
每个请求带的时间戳不能和当前时间超过一定规定的时间(60s)。这样请求即使被截取了,你也只能在60s内进行重放攻击,过期失效。
但是攻击者还有60s的时间攻击。所以我们就需要加上一个nonce随机数,防止60s内出现重复请求。
25、你们项目中怎么操作文件的,用的什么(大概问的是BIO/NIO)?
26、你们还在用JDK1.8是吧,知道java新特性吗,比如8的新特性有哪些?
27、知道为什么JDK现在都有12甚至14了,8却屹立不倒的原因吗?
28、你有什么想问的吗?
好的,今天面试到此结束,感谢参与,面试结果将会在评审后给你答复。
本文答案参考:
[1]@SingleOneMan:springboot-防止sql注入,xss攻击,cros恶意访问(含demo代码)
[2]@爱情小傻蛋:防止重放机制