435 位表示想打赏此文章

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

 

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

 

 

    348 位表示想打赏此文章

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

    217 位表示想打赏此文章

数据库表命名规范(摘选)

做过几个项目都是用这一套命名规范的。实际中可能难以完美匹配。理解为主
  • 数据库-表名table命名规范

2.1数据表命名规范

(1)采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线’_’组成,命名简洁明确,多个单词用下划线’_’分隔

(2)全部小写命名,禁止出现大写

(3)禁止使用数据库关键字,如:name,time ,datetime,password等

(4)表名称不应该取得太长(一般不超过三个英文单词)(实际mysql初始的表都4个单词了)

(5)表的名称一般使用名词或者动宾短语

(6)用单数形式表示名称,例如,使用 employee,而不是 employees

  • 数据表-字段column命名规范

续上:

(7)在命名表的列时,不要重复表的名称

例如,在名employe的表中避免使用名为employee_lastname的字段

究竟字段什么时候要加下划线拼凑,什么时候不需要呢?

①需要:这个字段column属于这个表table的、属于这个模块的、与其他功能互斥的,如order_id,bss_code。

如果不加前缀,在中间表时将会出现几个id、id。虽然pk和fk没强制要求命名一致,但肯定看懵的。

②不需要:行业上没歧义的,约定俗成的,如status,creator、modifier、age、sexual。

③不需要:你开发的系统的通用字段,如统一了dict_region中,region为{11,22,33},其他地方就没必要写order_region,person_region。

(8)不要在列的名称中包含数据类型

(9)字段命名使用完整名称,禁止缩写(尽量吧,工科生普遍英文不好,但pid/uid该打)

 

  • tables命名规范

模块_功能点 示例:alllive_log,alllive_category

②功能点 示例:live,message

③通用表 示例:all_user,sys_log,dict_region

  • column命名规范

①名词 示例:user_id,user_name,sex

②动宾短语 示例:is_friend,is_good

    294 位表示想打赏此文章

crontab表达式

crontab相当于windows的计划任务,我用centos7一般都是默认安装,默认开机启动。

一、命令
安装crontab:

[root@CentOS ~]# yum install vixie-cron
[root@CentOS ~]# yum install crontabs

启动crontab:

service crond (status|start|stop)

查看crontab列表:

crontab -l

新建crontab列表:

crontab -e

二、cron表达式:

例子:(从别人博客整理的)
每天 02:00 执行任务

0 2 * * * /bin/sh backup.sh

每 10min 执行一次任务

*/10 * * * * /scripts/monitor.sh

每天 5:00和17:00执行任务

0 5,17 * * * /scripts/script.sh

三、设了cron但运行不了的两个注意的事项:
①sh脚本中,有些命令是cron不能直接引用的,要在sh头部加入

export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin

②cron是直接在~目录下运行的,所以sh脚本要写绝对路径

    311 位表示想打赏此文章

Linux下实现密钥\私钥\公钥登录

很多时候为了防止服务器密码被暴力破解,或者想实现免密登录,我们可以利用密钥\私钥\公钥方式来登录。其实密钥\私钥\公钥说的都是一种方式,下面简称密钥登录,并介绍两种情况,但无论哪种,服务器都是放公钥

 

一、SecureCRT等客户端登录linux服务器

(服务器放自己的公钥,私钥给客户端使用)

1、制作密钥对

先登录到linux服务器,输入ssh-keygen生成公钥和私钥

id_rsa就是私钥,id_rsa.pub就是公钥。

 

2、在linux服务器上安装公钥

进入.ssh文件夹:

cd ~/.ssh

cat id_rsa.pub >> authorized_keys

chmod 600 authorized_keys

chmod 700 ~/.ssh

注意:authorized_keys文件是追加公钥,用的是>>而不是>,后续还能追加其他客户端登录。

authorized_keys文件权限必须是600,.ssh文件夹权限必须是700。

 

3、打开密钥登录

vi /etc/ssh/sshd_config ,主要留意以下4项:

RSAAuthentication yes //

PubkeyAuthentication yes //

PermitRootLogin yes //是否允许使用root登录

PasswordAuthentication yes //我理解是yes则rsa和密码都要验证才能登录。

 

4、获取私钥

将私钥保存到本地,在secureCRT的登录设置中选择即可,同理xshell等都行

cat /root/.ssh/id_rsa

 

二、linux客户端登录到linux服务器

(服务器放客户端的公钥,私钥给客户端使用)

1、制作密钥对

类似第一部分,先登录到linux客户端,输入ssh-keygen生成公钥和私钥。

 

2、拷贝公钥到服务器

①方法一:ssh-copy-id -i /root/.ssh/id_rsa.pub root@xx.xx.xx.xx

输入服务器密码则可以拷贝过去。拷完后登上去服务器检查下~/.ssh文件夹下面是不是有authorized_keys。

②方法二:如果服务器已经开启了密钥登录,则把客户端的id_rsa.pub文件通过其他手段拷贝到/root/.ssh/下面,然后cat id_rsa.pub >> authorized_keys

③保证服务器的authorized_keys的权限是600,.ssh文件夹的权限是700。linux客户端就能密钥登录linux服务器了。

    263 位表示想打赏此文章

世界,您好!

欢迎使用WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!