尼尧的面试日记:面试记录(二)

最近开始找工作了,坐标杭州。渣渣感觉面试应该挺困难的,也不知道具体会问哪些类型,会在面试完把每一次面试问到的题目列出来, 一个作用是参考记录,另一个作用是可以把自己不会或者弱项的问题及时补齐

暂时是先把问题列出来,有时间的时候会把答案补上。

希望能找到一个好工作,加油

尼尧的面试日记:面试记录(二)


我大概总结一下,小型公司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]@爱情小傻蛋:防止重放机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值