最近开始找工作了,坐标杭州。渣渣感觉面试应该挺困难的,也不知道具体会问哪些类型,会在面试完把每一次面试问到的题目列出来, 一个作用是参考记录,另一个作用是可以把自己不会或者弱项的问题及时补齐。
暂时是先把问题列出来,有时间的时候会把答案补上。
希望能找到一个好工作,加油
我大概总结一下,小型公司2年以下开发主要业务就是CRUD,招人肯定是希望能立马上手,所以面试范围我押题是常用的框架(SpringBoot、Spring基本概念,Mybatis),事务、数据库相关(锁、事务级别、sql优化,数据库底层概念等)、异常。有些会问一些设计模式(主要掌握工厂模式、单例模式、代理模式。)。
中大型公司的话,加上 JVM,集合,并发编程,一些网络知识。有些可能还会有一两道算法题。甚至开始问分布式了,具体看他们业务。
大厂请直接参考我画的java路线图,大厂知识路线没有3年以下之分,只有深/广度之分:Java知识体系脑图(2020年)
中型公司,安防类。据说是新成立的业务线,缺人,主要做安防类相应的APP。 现场面试,基本上就是围绕简历问了相关技术点,以及掌握的深度。
过程本次就一轮面试,一开始也是自我介绍,然后就围绕简历问了一些问题。
略
上一家公司与个人发展不符。阿巴阿巴阿巴 此处自己考虑,
SpringBoot是基于SpringMvc进行优化的,它的核心概念就是“约定大于配置”,在启动器中,将很多需要使用到的包以及需要配置的xml文件进行整合了,而约定大于配置的最重要的体现是在于自动配置,主启动类默认扫描启动与之同级别目录下的文件,因此文件创建的位置比较固定。而SpringBoot也因为这个特性相较于SpringMvc更简单易用,少了很多繁琐的xml配置文件。
缓存即把数据库的数据先读出来,存储在Redis等Nosql中,并设置一定的过期时间,当再次需要该数据时,先从速度较快的Nosql缓存数据中取,提高效率,减少DB层的压力。
用缓存,主要有两个用途:高性能、高并发。
缓存一般都是存储读多写少的数据;或者是需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求;还有就是一些访问频率高的热点数据,这些数据更新时也要及时更新到数据库。缓存这些数据可以提高系统的性能。
数据库并发量有限,可以依靠缓存提高并发性能,Nosql能支持的并发量比数据库有高得多。
读多写少的数据就比如用户拥有的权限,或者一些不怎么变化的数据,用户的个人基本信息啊,已完成只能查询的业务表单数据啊。用户日常主要业务一般就是热点数据了,这些数据也可以全都存到缓存里,但是为了保证数据一致性,更改的数据要及时更新到缓存里。
使用Mybatis连接,设置相应的参数,实际上底层是调用的Jdbc嘛,首先也是先获得驱动,然后再根据数据库地址、密码进行连接。
我们公司用的md5加密,忘了具体为什么用MD5加密了。
没有统计过,量级不是很大。 (尬)
量级比较小的,首先肯定是先优化查询语句,提高查询效率。量级大一些的就会使用索引来进行优化。 再大就要分库分表了。
没有。(尬,后期补上)
有些是自己建的,但前提是这一块是自己全部负责开发的才会这样。大多数时候编写接口时,只能用方法调用操作,并不会直接开放数据库,我们组之前有个数据库比较强的,基本上由他来负责管理数据库,也会根据每个人的业务创建用户来控制权限。
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中的?。重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。
简单来说,就是把你的请求原封不动地再发送一次,两次…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内出现重复请求。
本文答案参考: [1]@SingleOneMan:springboot-防止sql注入,xss攻击,cros恶意访问(含demo代码) [2]@爱情小傻蛋:防止重放机制