html注册成功信息传给登陆页面,从前后端分别学习——注册/登录流程2

昨天研究了网站的注册流程,感兴趣的可以看下:从前后端分别学习——注册/登录流程1

今天接着研究注册/登录流程之登录。

登录

首先来看一下登陆过程:

1460000016084471?w=429&h=732

登录逻辑和注册逻辑基本一致,但登录的过程只对数据库进行读,比对用户的信息是否存在。

登录页面的 HTML 和 CSS 基本一致,这里就不放上来了。

注册成功后跳转

当用户注册成功后,会跳转到登录页面,进入登录页面,发送GET请求,所以需要做一个路由,代码和之前一样,不熟悉的可以看上面该出的链接,这里就不放上来了。

当我检测到服务器成功返回的状态码时,操作页面跳转至登录页面

window.location.herf = '/sign_in'

当用户输入用户名和密码后,点击登录按钮,会发送POST请求,服务器收到请求后,解析前端传过来的数据,并读取数据库将二者的信息进行比对,如果一致就说明是本人。和之前相同的地方,这边就省略了。

let usersString = fs.readFileSync('./db/db','utf8')

let usersArr = JSON.parse(usersString)

let foundUser = false

for(let i = 0; i < usersArr.length; i++){

if(usersArr[i].email === email && usersArr[i].password === password){

foundUser = true

break

}

}

if(foundUser){

response.statusCode = 200

response.write(`{

"successes":{

"success":"success"

}

}`)

}else{

response.statusCode = 400

response.write(`{

"errors":{

"email":"foundUser"

}

}`)

}

如果对比成功,说明该用户已注册过;如果对比失败,返回对应的响应数据,让前端提示用户。

至此登录流程做完,是不是觉得很简单,在弄懂注册流程后,登录流程基本和它基本一致。

Cookie

登录流程虽然简单,这不是我们今天要研究的重点。

既然网站服务商需要用户祖册,那肯定注册用户和非注册用户能访问的页面肯定不一样,那网站服务商怎么区分注册用户和非注册用户呢?

对,就是Cookie,当用户登录成功后,浏览器会向用户发送一个 Cookie,用户下次请求时会带上Cookie,后端都能匹配上Cookie,就说明他是我们的注册用户,可以访问这个页面;如果Cookie匹配不上,当然就禁止访问了,Cookie具体的参数下一篇讨论,这里先上手直接使用一下,看看效果。

登录成功后跳转页面

当用户登录成功后,让他跳转至首页,首页上显示用户的密码,当然实际工作中不能这样用,这里显示密码以示区分注册用和非注册用户。

密码:__password__

首页非常简单,__password__处只是占位符,如果是注册用户这里会显示对应的密码。

1460000016084472?w=681&h=385

在登录成功后,服务器要给用户发放一个Cookie,这里现已用户的邮箱作为Cookie。

response.setHeader('Set-Cookie',`sign_in_email=${email}`)

设置了Cookie之后,可看到响应头中有了Set-Cookie

1460000016084473?w=604&h=168

当跳转首页时,会带上这个Cookie。

1460000016084474?w=648&h=240

后端继续做一个路由,当登录首页时,判断用户是否是注册用户,只需要看它的Cookie

读取Cookie

读取Cookie时要注意两点:

多Cookie是以"; "间隔,分号后面有空格

如非注册用户访问,没Cookie会报错,初始化时要赋值一个空数组。

if(path === '/home'){

let string = fs.readFileSync('./home.html','utf8')

response.setHeader('Content-Type','text/html;charset=utf-8')

let cookieArr = [] //初始化为空数组

if(request.headers.cookie){

cookieArr = request.headers.cookie.split('; ')

}

let cookieHashes = {} //拆分成需要的格式

cookieArr.forEach((e)=>{

let part =e.split('=')

cookieHashes[part[0]] = part[1]

})

response.write(string)

response.end()

}

验证Cookie

服务器发放的Cookie是用户的邮箱,所以这边就比对数据库里的邮箱,如果匹配上,说明是注册用户

let {sign_in_email} = cookieHashes

let usersString = fs.readFileSync('./db/db','utf8')

let usersArr = JSON.parse(usersString)

let foundUser

for(let i = 0; i < usersArr.length; i++){

if(usersArr[i].email === sign_in_email){ // 验证 Cookie

foundUser = usersArr[i]

break

}

}

权限分配

验证成功,给予访问;验证失败,不给访问。

if(foundUser){

response.statusCode = 200

string = string.replace('__password__',foundUser.password)

}else{

response.statusCode = 400

string = string.replace('__password__','未注册')

}

验证成功

1460000016084475?w=993&h=1011

验证失败

1460000016084476?w=1173&h=997

Session

用Cookie有个很大的问题:用户可以随意更改,如果有人知道了Cookie的规律,那他就可以随意获取用户信息了。

为解决这个问题,引入Session,它是由一组随机数组合的哈希表,当用户登录成功,本来发放Cookie给用户,现在变成发放Session给用户。

具体看下怎么实现呢

var sessions = {}

sessions[sessionId] = {sign_in_email:email}

response.setHeader('Set-Cookie',`sessionId=${sessionId}`)

之前发放的Cookie,现在变成了Session

1460000016084477?w=1114&h=1027

服务器不能在读Cookie了,也要变成读取Session,才能正常显示

let sessionsArr = []

if(request.headers.cookie){

sessionsArr = request.headers.cookie.split('; ')

}

let sessionHashes = {}

sessionsArr.forEach((e)=>{

let part =e.split('=')

sessionHashes[part[0]] = part[1]

})

//通过读取用户的 sessionId 比对 session 表中的 email

let sign_in_email

if(sessionHashes.sessionId){

sign_in_email = sessions[sessionHashes.sessionId].sign_in_email

}

上面代码都一样,这里换了个变量而已,只有最后一句不一样,如果sessionId存在才能找到session表中的用户邮箱。

1460000016084478?w=1081&h=982

总结

1460000016084479?w=810&h=893

经过两天研究注册和登录流程,弄清楚了各个环节,详细的过程如上图所示,有2点需要了解:

Cookie不可靠,用户可随意更改

Session一般用随机数表示,增强了安全性,缺点太占内存

通过这次学习不仅对ajax、Promise等技术了解更深,也大致明白了后端的工作流程。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目系统结构——前后端分离是一种常见的Web应用程序开发模式,它采用了一种分离前端和后端的策略,将应用程序分为两个独立的部分:前端和后端。这种模式通常用于构建复杂的应用程序,如企业级管理系统、在线购物平台等。 以下是项目系统结构——前后端分离的主要组成部分: 前端: 1. 客户端应用程序:通常使用JavaScript框架(如React、Vue、Angular等)或前端Web框架(如Django、Flask等)开发,用于处理用户界面、数据请求和响应等功能。 2. 静态资源:包括CSS、图片、JavaScript等静态资源文件,通常存储在Web服务器上,供前端应用程序使用。 后端: 1. API服务:提供RESTful或GraphQL风格的API接口,用于处理业务逻辑和数据操作。后端服务通常使用服务器端语言(如Python、Java、Node.js等)编写,并使用数据库存储数据。 2. 数据库:用于存储和管理应用程序的数据,通常使用关系型数据库(如MySQL、PostgreSQL等)或非关系型数据库(如MongoDB、Redis等)。 前后端分离的优点: 1. 开发效率高:前端和后端可以由不同的团队或个人独立开发,减少了沟通和协作的难度。 2. 可扩展性好:前后端分离的应用程序可以根据需要灵活地添加新的前端或后端组件,提高了系统的可扩展性。 3. 灵活性高:前端可以使用不同的技术栈,如移动端应用程序、小程序等,提高了应用的灵活性。 前后端分离的缺点: 1. 安全性问题:前后端分离的应用程序可能存在安全风险,如跨站脚本攻击(XSS)和SQL注入等。因此,需要采取适当的措施来保护应用程序的安全性。 2. 集成问题:前后端分离的应用程序需要将数据从后端传输到前端,需要处理数据格式转换、数据验证等问题。 3. 调试和测试难度大:前后端分离的应用程序需要分别进行调试和测试,增加了开发和测试的难度。 总之,项目系统结构——前后端分离是一种灵活、可扩展的开发模式,适用于构建复杂的应用程序。在开发过程,需要关注安全性和集成问题,并采取适当的措施来确保应用程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值