326 位表示想打赏此文章

http状态码

一、http状态码的作用

二、http状态码的分类

1xx:继续。只是告知一下客户端,服务器当前的状态。现在并不会使用。

2xx:完成。HTTP请求已经被完成,但不代表业务逻辑处理完成。

3xx:重定向。此请求需要进一步由其他代理部件完成。

4xx:客户端可能未按照预期运行,如405请求方式错误,404定位资源错误。

5xx:服务器无法执行(incapable of performing)这个请求,如504网关超时,500服务器内部错误。

三、http状态码的样子

http状态码在F12、fiddler中是长这样的:

但绝对不是这样的:

四、必须熟记的http状态码

200 OK:请求已成功

注意,这个是指http请求已完成

业务层面的代码逻辑(用户名密码错误这类),是不会返回4xx、5xx的。

400 Bad Request:语义有误

这个问题比较好定位,一般是请求体(request body)出现语法错误。

401 Unauthorized:未授权/需要授权

信息头(request head)应该包含一个Authorization信息。

从postman使用中可以了解到,是一个Authorization或者cookie字段。

403 Forbidden:服务器已经理解请求,但是拒绝执行它。

抱歉,暂不能理解这个状态码。

404 Not Found:资源未被在服务器上发现

不解释

405 Method Not Allowed:请求方法不允许

这个好理解,服务器不允许所用的请求方法。

500 Internal Server Error:内部服务器错误

敲黑板,划重点。

官方解释:服务器遇到了一个未曾预料(unexpected )的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。

所谓未曾预料,就是程序员在写代码时,没有对应的try{}catch{}代码,不能捕抓到当前的异常。

如数据库设计某个字段是10长度,代码要插入11长度。此时数据库会往上报一个Error updating database的错误。如果代码层有设计catch对应异常,则会返回一个200的回应给前端,具体报错放在message中;如果代码层没有设计catch对应异常,则会返回一个500的回应给前端,具体报错填满整个接口报文。

502 Bad Gateway:坏网关/网关收到无效回应

这个不是很好理解。当你向A服务器请求一个资源,A服务器要从B服务器获取此资源。但是A从B收到一个无效响应,则返回502。

504 Gateway Timeout:网关超时

续上,A服务器要从B服务器获取资源,限时xx秒。当B服务器xx秒内没有响应,则返回504。

五、根据状态码定位问题方法

200 OK

200只是http请求已完成,所以有时候500异常会因为有对应处理(可以理解成包装),也变成200返回,而具体报错会放在类似图中的message字段中。

图中就是一次底层数据库错误→中间层java处理→前端收到常规json的异常。

404 Not Found

500 Internal Server Error

 

504 Gateway Timeout

初级定位:从返回报文查看日志,看到504字眼,看到超时60s。说明这个“gateway”部件等待了60s,下游系统没有给回任何响应。

进阶定位:查看返回报文看出,这个是Nginx的返回报错,能理解这是请求到达了Nginx,Nginx已经把请求发过去下游系统,但一直没回应。

终极定位:从上面的定位可以知道,问题在于“下游”系统;那么我们就要到对应的服务器,查看日志,找出问题所在。

六、原版 HTTP Status Code Definitions

英文手册:HTTP Status Code Definitions

中文注解:http://tool.oschina.net/commons?type=5

 

感谢各位垂阅!鄙人想综合整理这文章几年了。

 

 

    258 位表示想打赏此文章

Cookie ,Session和Token的区别

Cookie和Session都是会话跟踪技术,Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

本文基本无原创,只摘录重点

一、Cookie :

Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。

cookie生成全过程:

  • 客户端发送一个http请求到服务器端
  • 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
  • 客户端发送一个http请求到服务器端,其中包含Cookie头部
  • 服务器端发送一个http响应到客户端

实例:(敲黑板划重点

会话Cookie和持久Cookie

若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在浏览器的不同进程间共享。这种称为持久Cookie

 

二、Session:

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。

什么东西可以让你每次请求都把SessionId自动带到服务器呢?显然就是cookie了,如果你想为用户建立一次会话,可以在用户授权成功时给他一个唯一的cookie。

session存放位置:

  • cookie
  • URL地址重写(不常用)
  • 表单隐藏字段(不常用)

“只要关闭浏览器 ,session就消失了?”

不对。对session来说,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。

以上两个是放在http请求的header中,下面说的是放在postbody中。

三、Token

Token是服务端生成的一串随机32位字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

如此说来,token肯定会存在泄露的问题。实际项目中,需要加参数、加时间戳、加盐、加密,在服务端进行校验有效性。

比如request入参为userId、timeStamp、token、appId、sign。前4个是可以通过抓包确定的,而sign=md5(userId+timeStamp+token+appId+SALT)。因为有动态入参timeStamp和私密SALT存在,所以sign基本无法伪造。

大部分参考以下文章:

http://www.cnblogs.com/endlessdream/p/4699273.html

http://www.cnblogs.com/JamesWang1993/p/8593494.html

https://www.cnblogs.com/andy-zhou/p/5360107.html