开始之前,我们先简单了解一下 注册/登录 的流程。(无代码)

  1. 进入注册页面,用户填入用户名、密码、手机号等“注册信息”。
  2. 前端验证用户填入的信息是否符合要求,如果不符合要求,就提示用户输入错误,重新输入。
  3. 如果符合要求,就将“注册信息”作为 post 的第四部分(字符串),向后端发起 post 请求。
  4. 后端收到 post 请求,将 post 的第四部分(字符串)转变成能用的格式。
  5. 后端拿到数据后,进行数据验证。
  6. 数据验证如果不通过,后端就返回 400(状态码)和错误信息(JSON 格式)给前端,前端根据错误信息,提示用户哪里输入错误。
  7. 数据验证如果通过,就将数据存入数据库。
  8. 存入数据库时,先检查数据库中是否包含该用户信息。
  9. 如果包含,后端返回错误信息给前端,前端提示用户“已注册”。
  10. 如果不包含,就将该用户数据写入数据库,并向前端发送响应,前端提示用户“注册成功”并跳转至登录页面。
  11. 用户填入“登录信息”。
  12. 前端验证“登录信息”是否符合要求,如果不符合,就重新输入。
  13. 如果符合,将“登录信息”作为 post 的第四部分,向后端发起 post 请求。
  14. 后端收到 post 请求,将 post 的第四部分(字符串)转变成能用的格式。
  15. 后端拿到数据后,与数据库的数据进行比对。
  16. 如果发现数据库没有该用户信息,就向前端发送“错误信息”,前端提示用户“未注册”。
  17. 如果数据库匹配到该用户信息,并且信息一致,说明该用户已注册,后端发送响应给前端,前端提示用户“登录成功”并跳转至首页(或其他页面)。

上面过程中,有一个注意点:

为什么前端和后端都要验证一遍用户填入的信息?

首先我们要知道,前端其实是可以不用验证用户填入的信息的,但是后端一定要验证。

但是如果前端不验证的话,就要发送一个请求给后端,让后端验证,如果后端验证失败,又要发个响应给前端。这无形中增加了请求和响应,也就给服务器增添了负担,不利于网络性能优化。所以最好让前端先把用户信息验证好,如果用户填入的信息没有问题,再将信息发送给后端。这样就不用来回的发送请求和响应。

另外,有些人可能会通过命令行,使用 curl 来访问服务器,这样一来就直接绕过了前端,直接访问后端。如果后端不验证,那么就可能出现安全问题了。

以上是注册登录的简单版本,实际工作中,会比这复杂的多。

下面有两张流程图,可以清晰看出 注册/登录 的流程。

注册
登录

图片来自 segmentfault 。


我们都知道,一个网站,你登录了和没登录,看到的页面是不一样的。

那么服务器是如何区分你是登录了还是没登录呢?或者你登录了以后,跳转到其他页面,其他页面是怎么知道你是已经登录的状态呢?这就需要用到 Cookie 了。

Cookie

什么是 Cookie?

Cookie 是服务器通过 HTTP 响应,写入浏览器的一小段文本信息。

为什么要使用Cookie?

Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息。

分辨请求是否来自同一个浏览器:

比如,你的电脑上同时安装了 Chrome 浏览器和 Safari 浏览器。当你用 Chrome 登录知乎后,再使用 Safari 登录时,会要求你重新登录。这是因为,服务器给 Chrome 的 Cookie 和 给 Safari 的 Cookie 是不一样的。就好比,你和你弟弟去游乐园玩,游乐园会给你们两张票,一张对你有用,一张对你弟弟有用,你不能用你弟弟的票,你弟弟也不能用你的票。

保存一些状态信息:

比如,你登录知乎后,在一段时间内,即使你关闭了浏览器,当再次打开知乎时,可以不用登录。这是因为,Cookie 中包含了“过期时间”,只要你在“过期”以前重新打开知乎,就可以不用登录。就好比,游乐园的门票的有效期为两天,在这两天时间内,不管你干嘛,哪怕你出园了,当你再次进入游乐园时,检票员发现你的票还没有过期,你就可以直接进入游乐园,不用再次买票。

怎么写 Cookie?

Cookie 是服务器写入浏览器的一小段文本信息,形如:

response.setHeader('Set-Cookie', 'userName=dongdong; password=123')  // 返回给浏览器的 Cookie 记录了用户名和密码

当然,服务器也可以设置多个 Cookie ,那么 HTTP 响应中就会包含多个 Set-Cookie 字段:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: a=1
Set-Cookie: b=2[page content]

浏览器向服务器发送请求时,就会带上这段文本信息,形如:

GET /xxx.html HTTP/1.1
Host: www.example.org
Cookie: userName=dongdong; password=123  // 浏览器带上的 Cookie 有用户名和密码

这样一来,服务器只要读取浏览器带上的 Cookie(票拿来给我看看),然后和服务器中的数据做对比(检查票上的信息),如果验证通过,就可以访问。

Cookie 的属性

Expires,Max-Age

上面说到,Cookie 是有过期时间的。在服务器,我们可以通过 Expires 和 Max-Age 两个属性来设置。如:

response.setHeader('Set-Cookie', 'expires=Wed, 21 Oct 2015 07:28:00 GMT')
response.setHeader('Set-Cookie', 'max-age=30')

上面代码中,分别通过 Expires 和 Max-Age 属性来设置过期时间,那么这两个有什么区别呢?

  • Expires 设置的是具体的过期时间,比如 xxx 年 xxx 月 xxx 日 xx : xx : xx ,到了这个时间后,Cookie 就会被删除;
  • Max-Age 设置的是从现在开始 Cookie 存在的秒数,比如有效期为 30s,30s 后,Cookie 就会被删除。

如果同时指定了 Expires 和 Max-Age,那么 Max-Age 的值将优先生效。

如果没有指定这两个属性,那么这个 Cookie 就是 Session Cookie,只在当前会话(Session)有效,如果关闭浏览器,那么 Cookie 就会被删除。

Secure,HttpOnly

Secure 和 HttpOnly 属性,可以不用指定属性值,如:

response.setHeader('Set-Cookie', 'Secure')
response.setHeader('Set-Cookie', 'HttpOnly')

Secure 属性指定浏览器只有在 HTTPS 协议下,才能将 Cookie 发送给服务器。另外,如果协议是 HTTP,那么浏览器会自动忽略服务器发来的 Secure 属性。换句话说,Secure 只在 HTTPS 协议下有效。

HttpOnly 属性指定只有在浏览器发出请求时,才会带上该 Cookie,该 Cookie 无法通过 JavaScript 脚本拿到。

比如通过 document.cookie 可以拿到当前网页的 Cookie:

document.cookie // "foo=bar;baz=bar"

但是如果该 Cookie 设置了 HttpOnly 属性,那就无法拿到 Cookie。

END~~

响应设置cookie_注册登录 与 Cookie相关推荐

  1. thinkphp框架之后台登录页面cookie有效期设置

    目前开始学框架了,发现蛮有意思的,可能是由于人性天生对未知事物的好奇, 居然感到乐趣丛生,可是也感觉要学的东西实在太多压力山大: 今天就碰到个后台登录页面设置cookie有效期的小问题,本来蛮简单的, ...

  2. Cookie的注册登录

    先写一个要跳转的index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  3. zblogphp登录和注册_zblog如何设置会员注册功能

    在独立ip虚拟主机环境下建设网站时,使用会员功能不仅可以作为站长统计数据的一种方式,而且也可以让自己的网站的内部信息增加一定的保护,还可以减少恶意评论和恶意灌水的行为.而现在绝大部分的网站程序都已经在 ...

  4. Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)

    注册登录界面尤为常见,我的界面尤为难看,勉为其难的写吧,前端不熟就是这样... 这个案例运用到了: 1.Jsp动态页面--->动态页面 2.Servlet逻辑判断后台---->实现界面与数 ...

  5. python相关注册登录方式

    1.使用django自带功能实现登录/退出登录 使用django自带登录功能,前提生成用户(用户注册)使用的是django自带的user,或称models中用户表继承于django自带的user 1. ...

  6. 手机短信验证码一键注册登录功能开发 2

    1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...

  7. express+vue+mongodb+session 实现注册登录

    上个月写了一篇文章是 express+mongodb+vue 实现增删改查. 只是简单的实现了增删改查功能,那么今天是在那个基础之上做了扩展,首先实现的功能有如下: 1. 支持注册,登录功能,用户可以 ...

  8. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:     第一:可以兼容各终端,特别是手机端.     第二:到时会用到大量html5,炫啊.     第三:导入博客园的精华文章,并做分类.(不要封我)     ...

  9. python学习第八天---用Django框架创建可重用注册登录系统

    python学习第八天---用Django框架创建可重用注册登录系统 实现的功能 项目开始前的整体规划 搭建环境完成基础配置 创建app 更改语言和时区 数据库表生成 启动开发服务器 浏览器访问,检测 ...

最新文章

  1. 172. Factorial Trailing Zeroes
  2. linux存储--inode与block详解(七)
  3. 文巾解题 180. 连续出现的数字
  4. PyQt5学习笔记05----Qt Designer信号槽
  5. 逻辑回归与线性回归的区别
  6. php accept-length,php中Accept-Length获取不到下载文件的大小
  7. linux改变时间 find,Find命令查找最近几天修改的文件
  8. node.js-session问题
  9. About 日常生活感想
  10. vue学习笔记-15-vue生命周期
  11. 天猫盒子android tv,天猫魔盒刷机教程 把天猫魔盒刷成安卓系统教程(附刷机包)...
  12. 开启 Windows 10 中的「卓越性能」电源计划
  13. 关于AD域和Exchange邮件服务器的学习总结
  14. 强制浏览器使用webkit内核
  15. 相机技术--摄像机720p、1080p、2mp、3mp、5mp;VGA, QHD, FHD, 2K,4K对应的分辨率分别是什么
  16. 码云 注册 注册个性域名报错---已经解决
  17. Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt‘: No such file or directory的解决方案(图文详解)
  18. 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)
  19. 如何通过maven官网查询相关依赖的具体代码和版本?
  20. 微信小程序module.exports 模块化

热门文章

  1. EXE.DLL文件图标导出器[免费下载]
  2. c语言mysql自动重连接_c++操作mysql数据库
  3. 大数据之Elasticsearch教程
  4. 敲低这个基因就可以开怀大吃了!诺奖技术助力编辑蛋白质组!NGS可使临床治疗受益!...
  5. “单细胞”前瞻 |新型微滴反应筛选技术ATAC-seq数据分析新篇章
  6. 正弦信号发生器设计——VHDL
  7. 电脑音频服务未运行怎么解决_电脑提示音频服务未运行怎么办,快来看看吧,图片描述(最多50字)...
  8. 提高篇 第四部分 数据结构 第2章 RMQ问题
  9. python刷题相关资料汇总(一)
  10. 第十届蓝桥杯大赛青少年创意编程C++组省赛 第2题 小猫吃鱼