网上的常规与经典面试题汇总与答案—–web部分
面试常考知识点
web
HTTP 请求的 GET 与 POST 方式的区别
- GET和POST长度的限制问题
GET
1.GET是通过URL提交数据,因此GET可提交的数据量就跟URL所能达到的最大长度有直接关系。 2.实际上HTTP协议对URL长度是没有限制的;限制URL长度大多数是浏览器或者服务器的配置参数
POST
1.同样的,HTTP协议没有对POST进行任何限制,一般是受服务器配置限制或者内存大小。2.PHP下可以修改php.conf的postmaxsize来设置POST的大小。
- 请求header的content-length问题
如果有人恶意伪造content-length很大的包头,但实际上发送content-length很小的请求,这样服务器会一直干等,直到超时。当然服务器是可以通过设置来避免该问题的
- GET和POST的安全性
1.GET是通过URL方式请求,可以直接看到,明文传输。
2.POST是通过请求header请求,可以开发者工具或者抓包可以看到,同样也是明文的。
3.GET请求会保存在浏览器历史纪录中,还可能会保存在Web的日志中。
- GET和POST对服务器的状态
根据http的设计,大家在看到get的时候,都期望这个请求对服务器没有修改,看到post的时候,都认为这对服务器产生了修改。
- GET幂等,POST不幂等幂等
是指同一个请求方法执行多次和仅执行一次的效果完全相同。
1.按照RFC规范,PUT,DELETE和安全方法都是幂等的。虽说是规范,但服务端实现是否幂等是无法确保的。
2.引入幂等主要是为了处理同一个请求重复发送的情况,比如在请求响应前失去连接,如果方法是幂等的,就可以放心地重发一次请求。这也是浏览器在后退/刷新时遇到POST会给用户提示的原因:POST语义不是幂等的,重复请求可能会带来意想不到的后果。
3.比如在微博这个场景里,GET的语义会被用在「看看我的Timeline上最新的20条微博」这样的场景,而POST的语义会被用在「发微博、评论、点赞」这样的场景中。
session 与 cookie 区别
- session 在服务器端,cookie 在客户端(浏览器)
- session 默认被存在在服务器的一个文件里(不是内存)
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
- session 可以放在 文件、数据库、或内存中都可以。
- 用户验证这种场合一般会用 session
session 分布式处理
大体有以下5种方式:
- 粘性session
- 服务器session复制
- session持久化到数据库
- session共享机制
https://my.oschina.net/u/1774673/blog/871912
TCP的三次握手和四次挥手
https://blog.csdn.net/xiaoliuliu2050/article/details/74178168
数据库
索引
索引的使用
什么时候使用索引表的主关键字
- 表的字段唯一约束
- 直接条件查询的字段
- 查询中与其它表关联的字段
- 查询中排序的字段
- 查询中统计或分组统计的字段
什么情况下应不建或少建索引
- 表记录太少
- 经常插入、删除、修改的表
- 数据重复且分布平均的表字段
- 经常和主字段一块查询但主字段索引值比较多的表字段
复合索引
命中规则
- 需要加索引的字段,需要在where条件中
- 数据量少的字段不需要索引
- 如果where条件中是or条件,加索引不起作用
- 符合最左原则
- 最左原则:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找
- 在创建符合索引时,应该仔细考虑列的顺序,对索引中的所有列搜索或对钱几列进行搜索时,符合索引非常有用。
- 当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引, 联合索引的话, 它往往计算的是第一个字段(最左边那个), 这样往往会走错索引
在mysql中使用索引注意
- 只要列中包含有null值将不会包含在索引中,复合索引只要有一列含有null值,那么这一列对于此复合索引就是无效的
- 对串列进行索引,如果可能应该指定一个前缀长度
- mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
- like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
- 不要在列上进行运算
- NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替
https://www.cnblogs.com/softidea/p/5977860.html
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句