响应设置cookie_注册登录 与 Cookie
开始之前,我们先简单了解一下 注册/登录 的流程。(无代码)
- 进入注册页面,用户填入用户名、密码、手机号等“注册信息”。
- 前端验证用户填入的信息是否符合要求,如果不符合要求,就提示用户输入错误,重新输入。
- 如果符合要求,就将“注册信息”作为 post 的第四部分(字符串),向后端发起 post 请求。
- 后端收到 post 请求,将 post 的第四部分(字符串)转变成能用的格式。
- 后端拿到数据后,进行数据验证。
- 数据验证如果不通过,后端就返回 400(状态码)和错误信息(JSON 格式)给前端,前端根据错误信息,提示用户哪里输入错误。
- 数据验证如果通过,就将数据存入数据库。
- 存入数据库时,先检查数据库中是否包含该用户信息。
- 如果包含,后端返回错误信息给前端,前端提示用户“已注册”。
- 如果不包含,就将该用户数据写入数据库,并向前端发送响应,前端提示用户“注册成功”并跳转至登录页面。
- 用户填入“登录信息”。
- 前端验证“登录信息”是否符合要求,如果不符合,就重新输入。
- 如果符合,将“登录信息”作为 post 的第四部分,向后端发起 post 请求。
- 后端收到 post 请求,将 post 的第四部分(字符串)转变成能用的格式。
- 后端拿到数据后,与数据库的数据进行比对。
- 如果发现数据库没有该用户信息,就向前端发送“错误信息”,前端提示用户“未注册”。
- 如果数据库匹配到该用户信息,并且信息一致,说明该用户已注册,后端发送响应给前端,前端提示用户“登录成功”并跳转至首页(或其他页面)。
上面过程中,有一个注意点:
为什么前端和后端都要验证一遍用户填入的信息?
首先我们要知道,前端其实是可以不用验证用户填入的信息的,但是后端一定要验证。
但是如果前端不验证的话,就要发送一个请求给后端,让后端验证,如果后端验证失败,又要发个响应给前端。这无形中增加了请求和响应,也就给服务器增添了负担,不利于网络性能优化。所以最好让前端先把用户信息验证好,如果用户填入的信息没有问题,再将信息发送给后端。这样就不用来回的发送请求和响应。
另外,有些人可能会通过命令行,使用 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相关推荐
- thinkphp框架之后台登录页面cookie有效期设置
目前开始学框架了,发现蛮有意思的,可能是由于人性天生对未知事物的好奇, 居然感到乐趣丛生,可是也感觉要学的东西实在太多压力山大: 今天就碰到个后台登录页面设置cookie有效期的小问题,本来蛮简单的, ...
- Cookie的注册登录
先写一个要跳转的index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- zblogphp登录和注册_zblog如何设置会员注册功能
在独立ip虚拟主机环境下建设网站时,使用会员功能不仅可以作为站长统计数据的一种方式,而且也可以让自己的网站的内部信息增加一定的保护,还可以减少恶意评论和恶意灌水的行为.而现在绝大部分的网站程序都已经在 ...
- Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)
注册登录界面尤为常见,我的界面尤为难看,勉为其难的写吧,前端不熟就是这样... 这个案例运用到了: 1.Jsp动态页面--->动态页面 2.Servlet逻辑判断后台---->实现界面与数 ...
- python相关注册登录方式
1.使用django自带功能实现登录/退出登录 使用django自带登录功能,前提生成用户(用户注册)使用的是django自带的user,或称models中用户表继承于django自带的user 1. ...
- 手机短信验证码一键注册登录功能开发 2
1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...
- express+vue+mongodb+session 实现注册登录
上个月写了一篇文章是 express+mongodb+vue 实现增删改查. 只是简单的实现了增删改查功能,那么今天是在那个基础之上做了扩展,首先实现的功能有如下: 1. 支持注册,登录功能,用户可以 ...
- 一步步开发自己的博客 .NET版(3、注册登录功能)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) ...
- python学习第八天---用Django框架创建可重用注册登录系统
python学习第八天---用Django框架创建可重用注册登录系统 实现的功能 项目开始前的整体规划 搭建环境完成基础配置 创建app 更改语言和时区 数据库表生成 启动开发服务器 浏览器访问,检测 ...
最新文章
- 172. Factorial Trailing Zeroes
- linux存储--inode与block详解(七)
- 文巾解题 180. 连续出现的数字
- PyQt5学习笔记05----Qt Designer信号槽
- 逻辑回归与线性回归的区别
- php accept-length,php中Accept-Length获取不到下载文件的大小
- linux改变时间 find,Find命令查找最近几天修改的文件
- node.js-session问题
- About 日常生活感想
- vue学习笔记-15-vue生命周期
- 天猫盒子android tv,天猫魔盒刷机教程 把天猫魔盒刷成安卓系统教程(附刷机包)...
- 开启 Windows 10 中的「卓越性能」电源计划
- 关于AD域和Exchange邮件服务器的学习总结
- 强制浏览器使用webkit内核
- 相机技术--摄像机720p、1080p、2mp、3mp、5mp;VGA, QHD, FHD, 2K,4K对应的分辨率分别是什么
- 码云 注册 注册个性域名报错---已经解决
- Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt‘: No such file or directory的解决方案(图文详解)
- 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)
- 如何通过maven官网查询相关依赖的具体代码和版本?
- 微信小程序module.exports 模块化
热门文章
- EXE.DLL文件图标导出器[免费下载]
- c语言mysql自动重连接_c++操作mysql数据库
- 大数据之Elasticsearch教程
- 敲低这个基因就可以开怀大吃了!诺奖技术助力编辑蛋白质组!NGS可使临床治疗受益!...
- “单细胞”前瞻 |新型微滴反应筛选技术ATAC-seq数据分析新篇章
- 正弦信号发生器设计——VHDL
- 电脑音频服务未运行怎么解决_电脑提示音频服务未运行怎么办,快来看看吧,图片描述(最多50字)...
- 提高篇 第四部分 数据结构 第2章 RMQ问题
- python刷题相关资料汇总(一)
- 第十届蓝桥杯大赛青少年创意编程C++组省赛 第2题 小猫吃鱼