1. 什么是SQL注入?如何防止SQL注入?MyBatis如何防止SQL注入?

SQL注入就是:用户提交的表单信息中,可能会有恶意SQL,如果不做预防,可能会破坏数据库。
防止SQL注入,有3种解决方案:
1、对于表单提交的信息,我们可以做过滤,过滤掉分隔符;等信息,即使有恶意SQL也不起作用
2、可以限制普通用户操作数据库的权限
3、可以使用PrepareStatement对SQL进行预编译
MyBatis中有两种传参#$,使用#则MyBatis会自动对参数使用引号,很大程度上可以保证不被SQL注入;使用另一个则是直接拼接SQL,会搞SQL注入的风险

2. Http常见的请求头和响应头,Http状态码分类和常见的状态码

  1. Http常见的请求头:
    • User-Agent:当前浏览器的版本信息
    • Refer:当前请求的URL信息,包括:协议+域名+查询参数。通常根据该请求头做防盗链和统计
    • Host:服务器的域名
    • Origin:告诉服务器,当前请求的协议+域名信息。
    • Connection:keep-alive,表示开启HTTP长连接
    • Cookie
    • Content-Type
    • X-Requested-With:XMLHttpRequest,表示当前请求是异步请求
  2. Http常见的响应头:
    • Content-Length:响应体的字节长度
    • Content-Type:响应体的MIME类型
    • Location:重定向的URL。一般配合设置的状态码为3xx使用
    • Access-Control-Allow-Origin:指定哪些站点可以参与跨站资源共享
  3. Http状态码分类及常见状态码:http响应状态码一般分为1xx, 2xx, 3xx, 4xx, 5xx
    • 1xx -- 信息提示,表示临时的响应。例如101服务器将遵从客户的请求转换到另外一种协议
    • 2xx -- 成功,200一切正常,202接收请求但是处理尚未完成
    • 3xx -- 重定向。当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只 能跟随对GET请求的重定向
    • 4xx -- 客户端错误。400客户端语法错误,401访问被拒绝,403资源不可用,404无法找到资源位置
    • 5xx -- 服务器错误。500服务器出现错误无法应答,501服务器不支持实现请求所需要的功能,503服务器不可用,504网关超时

3. Spring实现动态代理的两个方式

  1. Spring实现动态代理有两个方式:JDK动态代理和cglib动态代理
  2. JDK动态代理和cglib动态代理区别
    • JDK动态代理:
      通过Proxy.newInstance()实现,必须保证被代理的类,实现了某些接口。
      因此JDK动态代理,代理类使用的是增强后的接口重写的方法。
    • cglib动态代理:
      通过开源包中的Proxy类实现,Spring在无法使用JDK动态代理时会使用cglib动态代理。
      cglib动态代理是通过继承原始类,然后重写原始类的public方法时进行增强的方式实现动态代理。因此必须保证原始类不能被final修饰。

4. 事务的特性和隔离级别,以及隔离级别的实现

  1. 事务的特性:ACID
    • A,原子性 -- 必须保证一个事务中的数据操作要么同时成功,要么同时失败。
    • C,一致性 -- 事务操作的前后,必须保证数据的总量不变。
    • I,隔离性 -- 多个事务之间相互独立
    • D,持久性 -- 事务提交或者回滚后,必须永久性的更新数据表
  2. 事务的隔离级别
    1. 介绍
      多个事务之间相互独立,但是如果多个事务操作同一片数据,可能会有脏读、不可重复读、幻读的问题。
      因此需要设置事务的隔离级别
    2. 脏读、不可重复读、幻读问题
      • 脏读:一个事务读取记录时,读取到另一个事务修改了但是没有提交的该记录
      • 不可重复读:一个事务读取同一个记录,多次读取的记录不一样
      • 幻读:一个事务读取到表中一个结果集,另一个事务往表中插入了一个记录,导致结果集不一致
    3. 隔离级别
      事务有4大隔离级别,读未提交、读已提交、可重复读、串行化
      MySQL默认使用可重复读级别
    4. 隔离级别的具体实现
      • 读未提交:该级别脏读、不可重复读、幻读问题都在
        对一个记录,读操作时不加锁;对一个记录,在更新(更新的瞬间)加入行级共享锁,事务结束释放
      • 读已提交:该级别解决了脏读问题,不可重复读、幻读问题仍在
        读一个记录,读操作(读到数据时)加入行级共享锁;在更新(更新的瞬间)加上行级排它锁,事务结束释放
      • 可重复读:该级别解决了脏读、不可重复读问题,幻读问题仍在
        读一个记录,读操作(读的瞬间)加入行级共享锁;在更新(更新的瞬间)加入行级排他锁,事务结束释放
      • 串行化:该级别解决所有问题
        使用表锁,读取记录(读的瞬间)加入表级共享锁;在更新(更新的瞬间)加入表级排它锁,事务结束释放