ARTS-week03

ARTS是什么?
Algorithm:每周至少做一个LeetCode的算法题
Review:阅读并点评至少一篇英文技术文章
Tip:学习至少一个技术技巧
Share:分享一篇有观点和思考的技术文章

Algorithm

15. 三数之和

  • 将数组排序
  • 双指针向中间逼近
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList();
        int len=nums.length;
        if(nums == null || len < 3) return res;
        Arrays.sort(nums);
        for(int i=0; i<len;i++){
            int L = i+1;
            int R = len-1;
            if(nums[i]>0) break;
            if(i>0 && nums[i] == nums[i-1]) continue;
            while(L < R){
                int sum = nums[i]+nums[L]+nums[R];
                if(sum == 0){
                    res.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    while(L<R && nums[L]==nums[L+1]) L++; //去重
                    while(L<R && nums[R]==nums[R-1]) R--; //去重
                    L++;
                    R--; 
                }
                else if(sum<0) L++;
                else if(sum>0) R--;
            }
        }
        return res;
    }
}

Review

GET or POST? 11 interview questions that most devs get wrong.

1. 如果浏览器作为客户端,哪一个方法保存在浏览器的session历史中

  • GET参数保存在session中,点击页面的一个东西,可以返回。但是还有一种情况,就是使用ajax的时候,不会保留
  • POST参数,如果用户提交表单后,然后返回,浏览器会提示你重新输入,之前的数据没有保留在历史中

2. 如果浏览器作为客户端,哪一个方法可以保留缓存

  • 首先介绍幂等性,一个HTTP方法是幂等的,指的就是同样的请求被执行一次或连续执行多次效果是一样的,服务的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下,GET,HEAD,PUTDELETE等方法都是幂等的,而POST方法不是。

  • GET请求可以被缓存,因为GET是幂等性的,并且大多数的网页资源都会通过这个方法返回,默认情况下,浏览器会缓存get请求,所以下次访问的时候,不必向服务器重新请求所有的资源,直接在浏览器的缓存中就能获得

  • 然而这样还遇到一个问题,当服务端重新部署时,客户端依然访问本地浏览器的缓存,所以说,每个请求的URL必须改变或者客户自己清除浏览器缓存,一般来说改变请求的URL
    image20200604103446053.png

3. 哪一个是安全的

从后台资源上,GET是安全的,因为GET不改变后台资源

从显示方面,GET是不安全的,因为数据在地址栏显示

从传输的角度,两者都是不安全的,因为HTTP在网络上是明文传输的

4. 静态网站只响应GET请求

静态网站不需要别的工具处理网站的内容,只需要返回网站的可读内容即可,比如你可以在Amazon S3托管一个静态网站

5. 哪个方法有长度限制

HTTP协议没有Body和URL的长度限制,对URL的限制大多数是浏览器和服务器的原因

浏览器原因就不说了,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。

6.总结

  • GET 用于获取信息,是无副作用的,可收藏为书签,是幂等的,且可缓存,只允许ASSII字符
  • POST 用于修改服务器上的数据,有副作用,不可收藏为书签,非幂等,不可缓存,没有字符限制(也允许二进制数据)

Tip

HTTP协议的四种传参方式

HTTP协议的组成协议内容示例对应Spring注解
path info传参/articles/12 (查询id为12的文章,12是参数)@PathVariable
URL Query String 传参/articles?id=12@RequestParam
Body 传参Content-Type:multipart/form-data@RequestBody
Body 传参Content-Type:application/json,或其他自定义格式@RequestBody
Headers 传参 @RequestHeader

Share

为什么 TCP/IP 协议会拆分数据

  • IP 协议拆分数据是因为物理设备的限制,一次能够传输的数据由路径上 MTU 最小的设备决定,一旦 IP 协议传输的数据包超过 MTU 的限制就会发生丢包,所以我们需要通过路径 MTU 发现获取传输路径上的 MTU 限制;
  • TCP 协议拆分数据是为了保证传输的可靠性和顺序,作为可靠的传输协议,为了保证数据的传输顺序,它需要为每一个数据段增加包含序列号的 TCP 协议头,如果数据段大小超过了 IP 协议的 MTU 限制, 就会带来更多额外的重传和重组开销,影响性能。

参考

都9102年了,还问GET和POST的区别