日常笔记记录

1、Http

1.1 概念

HTTP 是 HyperText Transfer Protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,是客户端与服务端进行交互时必须遵循的规则。它用于定义 Web 浏览器与 Web 服务器之间交换数据的过程以及数据本身的格式,底层是靠 TCP 进行可靠地信息传输。

1.2 URL

URL(统一资源定位符)是 Uniform Resource Locator 的缩写。它用来找到资源所在的位置,并且去访问和得到资源

URL格式:

http://122.225.198.118:5000/api/ERPWeb/DocumentFlow/GetByPage?page_index=1&page_size=15&state=2&server_id=60.191.59.11
http://www.pycxbus.cn/service.aspx
https://a1.easemob.com/1101221025110065/demo/chatgroups
  • http:协议。比如,https、ftp 等协议。
  • 122.225.198.118:服务器地址(IP,域名)
  • 5000:服务端口
  • /api/ERPWeb/DocumentFlow/GetByPage:资源路径(接口路径)
  • page_index=1:参数

1.3 Http报文格式

请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。

  • 请求报文

    请求报文是由请求方法、请求 URL、协议版本、可选的请求首部字段和内容实体构成的。

  • 响应报文

    响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。

1.4 Http方法

  • Get 请求资源(一般用于查询)

    参数放在url后,格式?key1=value1&key2=value2

    get方法提交的数据大小长度并没有限制,Http协议规范没有对URL长度进行限制,目前说的get长度有限制,是特定的浏览器及服务器对它的限制。

    浏览器:
    
    IE:对URL的最大限制为2083个字符,若超出这个数字,提交按钮没有任何反应。
    
    Firefox:对Firefox浏览器URL的长度限制为:65536个字符。
    
    Safari:URL最大长度限制为80000个字符。
    
    Opera:URL最大长度限制为190000个字符。
    
    Google(chrome):URL最大长度限制为8182个字符。
    
    服务器:
    
    Apache:能接受的最大url长度为8192个字符
    
    IIS:能接受最大url的长度为16384个字符。
    
    Nginx:可以通过修改配置来改变长度限制。
    client_header_buffer_size 默认值:client_header_buffer_size 1k
    large_client_header_buffers默认值 :large_client_header_buffers 4 4k/8k
    
  • Post 传输实体主体(一般用于新增编辑)

    content-type是http请求的响应头和请求头的字段。当作为响应头时,告诉客户端实际返回的内容的内容类型。作为请求头时(post或者put),客户端告诉服务器实际发送的数据类型。

    在前端开发过程中,通常需要跟后端工程师对接接口的数据格式,不同的数据类型对于服务器来说有不同的处理方式,因此我们需要关注不同的conten-type类型

    • application/x-www-form-urlencoded

      代表项目调度系统,浏览器原生form表单默认的提交方式(在不设置enctype的情况下)。此时请求头的格式如下:

      content-type: application/x-www-form-urlencoded;charset=utf-8
      form-data: key1=val1&key2=val2
      

      此时后端获取参数值方法

      framework
      Request["key1"]
      
      netcore
      [HttpPost]
      public void Test([FromForm] FlowRecordQuery query)
      

      此种情况下:非字母或数字的字符会被进行编码(编码方式percent-encoding百分比编码),这种方式不支持二进制数据。

    • multipart/form-data

      用于文件上传接口,与application/x-www-form-urlencoded的区别是支持文件的传输,并且它的传输数据放在request-payload里,并且以bounday进行分隔。

      POST /test.html HTTP/1.1 
      Host: example.org 
      Content-Type: multipart/form-data;boundary="boundary" 
      
      --boundary 
      Content-Disposition: form-data; name="field1" 
      
      value1 
      --boundary 
      Content-Disposition: form-data; name="field2"; filename="example.txt" 
      
      value2
      

      此时后端获取参数值方法

      framework
      Request.Files["file"]
      
      netcore
      和application/x-www-form-urlencoded一致
      
    • application/json

      POST http://www.example.com HTTP/1.1 
      Content-Type: application/json;charset=utf-8
      
      {"title":"test","sub":[1,2,3]}
      

      它用来告诉服务端消息主体是序列化后的JSON字符串,其中一个好处就是JSON 格式支持比键值对复杂得多的结构化数据。

      此时后端获取参数值方法

      framework
      Request.Files["file"]
      
      netcore
      public void Test(FlowRecordQuery query)
      

1.5 Http访问控制(CORS跨域资源共享)

  • 跨域:指不同域名之间相互访问,浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全机制。

  • 同域:指同一协议、同一 ip 地址、同一端口,其中有一个不同就会产生跨域。

解决办法:

//请求跨域处理,配置IP白名单
services.AddCors(options =>
    options.AddPolicy("ALL", p =>
        p.WithOrigins(
                Configuration.GetSection("AppSetting:CorsOrigins").Value
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray())
        .AllowAnyHeader()
        .AllowAnyMethod()
        .AllowCredentials())
);

//文件跨域处理
app.UseStaticFiles(new StaticFileOptions
{
    //指定实际物理路径
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "文件目录")),
    OnPrepareResponse = (c) =>
    {
        c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    },
    //设置URL请求的文件路径
    RequestPath = new PathString("/images")
});

IIS跨域处理

Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:GET,POST,PUT,DELETE,OPTIONS
Access-Control-Allow-Origin:*

[外链图片转存中...(img-PuUcIudA-1668680914968)]

[外链图片转存中...(img-7ckzdP7x-1668680914969)]

1.6 Http状态码(不是业务状态码)

  • 2** 处理成功响应类
    200:处理成功
    204:处理成功但没有任何返回
  • 4** 客户端错误
    401:未授权(没有加Token或者Token过期)
    403:禁止的动作(没有权限,比如用户没有新增权限,调用新增接口)
    404:资源路径找不到(请求路径不对,注意中英文、空格等)
    405:请求方法不正确(Get接口使用Post请求)
  • 5** 服务端错误
    500:服务器内部错误(服务挂掉、服务运行异常)
    503:服务不可用(IIS应用程序池没有开启)

2、抓包

3、Https

大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。

HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

为什么需要加密?

因为http的内容是明文传输的,明文数据会经过中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击。所以我们才需要对信息进行加密。最容易理解的就是对称加密 。

为什么需要CA认证机构颁发证书?

HTTP 协议被认为不安全是因为传输过程容易被监听者勾线监听、伪造服务器,而 HTTPS 协议主要解决的便是网络传输的安全性问题。

首先我们假设不存在认证机构,任何人都可以制作证书,这带来的安全风险便是经典的**"中间人攻击"**问题。

浏览器是如何确保 CA 证书的合法性?

证书包含颁发机构信息、公钥公司信息、域名、有效期、指纹

首先,权威机构是要有认证的,不是随便一个机构都有资格颁发证书,不然也不叫做权威机构。证书分为免费的、收费。免费阿里云有效期1年

浏览器验证证书的合法性:

验证域名、有效期等信息是否正确。证书上都有包含这些信息,比较容易完成验证;

判断证书来源是否合法。每份签发证书都可以根据验证链查找到对应的根证书,操作系统、浏览器会在本地存储权威机构的根证书,利用本地根证书可以对对应机构签发证书完成来源验证;

目前项目涉及到微信公众号、小程序项目都需要Https访问

4、Nginx反向代理和负载均衡

1.反向代理:简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已(嘉兴公交)。

Http配置

http {
    include       mime.types;
    default_type  application/octet-stream;
    
    server_tokens off;
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection  "1; mode=block";
    add_header X-Content-Type-Options nosniff;

    sendfile        on;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       8000;
        server_name  127.0.0.1;

        index index.html;
         
        location / {
			proxy_pass http://192.168.3.191:8000;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       8001;
        server_name  127.0.0.1;

        index index.html;
         
        location / {
			proxy_pass http://192.168.3.192:8001;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    server {
        listen       8001;
        server_name  127.0.0.1;

        index index.html;
         
        location /test {
			proxy_pass http://192.168.3.193:8001;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

TCP/UDP配置

stream {
    server {
       listen 7001;
       proxy_connect_timeout 10s;
       proxy_timeout 360s;
       proxy_pass 192.168.3.191:7003;
    }
    
    server {
       listen 7001 udp;
       proxy_connect_timeout 10s;
       proxy_timeout 360s;
       proxy_pass 192.168.3.191:7003;
    }
}

2.单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,由反向代理服务器将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡

负载均衡配置

upstream test {  
    server 192.168.3.191:8081;  
    server 192.168.3.192:8081;  
}  
server {  
    listen       8081;                                                        
    server_name  127.0.0.1;                                                 
    client_max_body_size 1024M;  
  
    location / {  
        proxy_pass http://test;  
        proxy_set_header Host $host:$server_port;  
    }  
}  

负载均衡策略

  • 轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

    upstream test {  
        server 192.168.3.191:8081;  
        server 192.168.3.192:8081;  
    } 
    
  • 指定权重

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

    权重越高,在被访问的概率越大,如下例,分别是30%,70%。

    upstream test {
        server 192.168.3.191:8081 weight=3;
        server 192.168.3.192:8081 weight=7;
    }
    
  • ip_hash

    在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。

    我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    upstream test {
        ip_hash;
        ...  
    } 
    
  • fair

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  • url_hash

    按访问url的hash结果来分配请求,使每个url定向到同一个(对应的)后端服务器,后端服务器为缓存时比较有效。

最终总结

upstream test{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示单前的server暂时不参与负载) 
    server 127.0.0.1:8080 weight=2; (weight 默认为1.weight越大,负载的权重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它所有的非backup机器down或者忙的时候,请求backup机器) 
} 

5、IIS部署服务

1、安装.NetSDK和Hosting Bundle

2、添加网站,选择端口号和资源路径

3、设置应用程序池

6、常见问题

  • IP地址

    • 0.0.0.0
      用于表示一个无效的,未知的或者不可用的目标
      用作服务端,表示本机上的任意IPV4地址
    • 127.0.0.1
      回环地址,本机地址。用于本机测试
    • 192.168.*.*
      局域网地址,路由器分配
    • loaclhost
      大多数电脑指向 127.0.0.1这个IP地址。在操作系统支持ipv6后,它同时还指向 ipv6 的地址 [::1]
      不是一个IP地址,而是一个域名
  • 前后端开发阶段测试联调?

    局域网内或者同一WiFi下

    1、以0.0.0.0或者本机局域网IP启动服务

    2、电脑关掉防火墙

    3、需要开通端口映射(需要公网访问)

    家里开通公网端口(公网IP一直变化)

    1、让运营商宽带改为桥接模式

    2、使用宽带账号密码方式上网

    3、开启动态域名服务,Tplink路由器提供域名,华为路由器支持花生壳域名

    4、注册花生壳账号,开启域名管理或者内网穿透

  • 域名

    域名简单来说就是一串由英文字符组成的IP地址。通过域名,我们可以很轻松的访问网站。在没有域名的情况下,我们如果需要访问网站的话,则需要输入很复杂的IP地址,如果有了域名,我们只需要记住它的域名即可以进行访问。

  • DNS:进行域名解析,

    一般使用8.8.8.8(Google公司),114.114.114.114

    host文件地址:C:\Windows\System32\drivers\etc

  • 接口参数规范

    下拉框:对象(大多是数值、字符串)

    下拉框多选:数组

    日期:yyyy-MM-dd

    日期时间:yyyy-MM-dd HH:mm:ss

    日期时间范围查询:分为开始时间和结束时间范围查询,

    假如年月范围查询yyyy-MM-01和yyyy-MM-30 23:59:59

    假如时分范围查询yyyy-MM-dd HH:mm:00,必须保证时间格式一致

相关推荐
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
Hejjon10 小时前
SpringBoot 整合 SQLite 数据库
笔记
西洼工作室12 小时前
【java 正则表达式 笔记】
java·笔记·正则表达式
初学者7.13 小时前
Webpack学习笔记(2)
笔记·学习·webpack
新手上路狂踩坑14 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
stm 学习ing15 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl
尘觉15 小时前
算法的学习笔记—扑克牌顺子(牛客JZ61)
数据结构·笔记·学习·算法
bohu8316 小时前
sentinel学习笔记1-为什么需要服务降级
笔记·学习·sentinel·滑动窗口
初学者7.17 小时前
Webpack学习笔记(3)
笔记·学习·webpack
bohu8318 小时前
sentinel学习笔记5-资源指标数据统计
笔记·sentinel·statisticslot