1. 什么是SQL注入?如何防止SQL注入?MyBatis如何防止SQL注入?
SQL注入就是:用户提交的表单信息中,可能会有恶意SQL,如果不做预防,可能会破坏数据库。
防止SQL注入,有3种解决方案:
1、对于表单提交的信息,我们可以做过滤,过滤掉分隔符;等信息,即使有恶意SQL也不起作用
2、可以限制普通用户操作数据库的权限
3、可以使用PrepareStatement对SQL进行预编译
MyBatis中有两种传参#
和$
,使用#
则MyBatis会自动对参数使用引号,很大程度上可以保证不被SQL注入;使用另一个则是直接拼接SQL,会搞SQL注入的风险
2. Http常见的请求头和响应头,Http状态码分类和常见的状态码
- Http常见的请求头:
- User-Agent:当前浏览器的版本信息
- Refer:当前请求的URL信息,包括:协议+域名+查询参数。通常根据该请求头做防盗链和统计
- Host:服务器的域名
- Origin:告诉服务器,当前请求的协议+域名信息。
- Connection:keep-alive,表示开启HTTP长连接
- Cookie
- Content-Type
- X-Requested-With:XMLHttpRequest,表示当前请求是异步请求
- Http常见的响应头:
- Content-Length:响应体的字节长度
- Content-Type:响应体的MIME类型
- Location:重定向的URL。一般配合设置的状态码为3xx使用
- Access-Control-Allow-Origin:指定哪些站点可以参与跨站资源共享
- 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实现动态代理的两个方式
- Spring实现动态代理有两个方式:JDK动态代理和cglib动态代理
- JDK动态代理和cglib动态代理区别
- JDK动态代理:
通过Proxy.newInstance()实现,必须保证被代理的类,实现了某些接口。
因此JDK动态代理,代理类使用的是增强后的接口重写的方法。 - cglib动态代理:
通过开源包中的Proxy类实现,Spring在无法使用JDK动态代理时会使用cglib动态代理。
cglib动态代理是通过继承原始类,然后重写原始类的public方法时进行增强的方式实现动态代理。因此必须保证原始类不能被final修饰。
- JDK动态代理:
4. 事务的特性和隔离级别,以及隔离级别的实现
- 事务的特性:ACID
- A,原子性 -- 必须保证一个事务中的数据操作要么同时成功,要么同时失败。
- C,一致性 -- 事务操作的前后,必须保证数据的总量不变。
- I,隔离性 -- 多个事务之间相互独立
- D,持久性 -- 事务提交或者回滚后,必须永久性的更新数据表
- 事务的隔离级别
- 介绍
多个事务之间相互独立,但是如果多个事务操作同一片数据,可能会有脏读、不可重复读、幻读的问题。
因此需要设置事务的隔离级别 - 脏读、不可重复读、幻读问题
- 脏读:一个事务读取记录时,读取到另一个事务修改了但是没有提交的该记录
- 不可重复读:一个事务读取同一个记录,多次读取的记录不一样
- 幻读:一个事务读取到表中一个结果集,另一个事务往表中插入了一个记录,导致结果集不一致
- 隔离级别
事务有4大隔离级别,读未提交、读已提交、可重复读、串行化
MySQL默认使用可重复读级别 - 隔离级别的具体实现
- 读未提交:该级别脏读、不可重复读、幻读问题都在
对一个记录,读操作时不加锁;对一个记录,在更新(更新的瞬间)加入行级共享锁,事务结束释放 - 读已提交:该级别解决了脏读问题,不可重复读、幻读问题仍在
读一个记录,读操作(读到数据时)加入行级共享锁;在更新(更新的瞬间)加上行级排它锁,事务结束释放 - 可重复读:该级别解决了脏读、不可重复读问题,幻读问题仍在
读一个记录,读操作(读的瞬间)加入行级共享锁;在更新(更新的瞬间)加入行级排他锁,事务结束释放 - 串行化:该级别解决所有问题
使用表锁,读取记录(读的瞬间)加入表级共享锁;在更新(更新的瞬间)加入表级排它锁,事务结束释放
- 读未提交:该级别脏读、不可重复读、幻读问题都在
- 介绍