Egg之用户登录状态(上)

多日未见,倍感思念,这一章节,讲的还是eggjs的内容,尽量这周有时间就给大家结束eggjs的章节,然后继续更react的内容,原计划是两周时间结束的,毕竟博主太懒了。这栏目结束,后面主要讲react的模块,以及会插着写面试题的相关内容。

一、http知识点复习

1、请求

  • get请求
  • post请求
  • delete请求
  • put请求

2、响应
状态:200,404,500等等
数据:json格式,JavaScript对象表示法

{
"name":'小明',
"age":24
}
["香蕉","苹果"]

3、无状态
http是一个无状态的协议

二、服务器如何识别用户

1、使用cookie与session识别用户(cookie存储在客户端,session存储在服务器端)
2、使用JWT(Json Web Token)识别用户
这两者都是让用户保持登录状态

那么如何用session保持用户登录状态
1、登录后可以访问首页
2、未登录,访问首页会跳转到登录页

三、实现保持用户登录状态(session)

1、在view文件夹下(没有,就自己建一个,具体操作请看前面的章节),建两个html页面,一个登录页(login.html),一个首页(home.html)

//home.html



  
  
  
  首页


  
首页
//login.html




  
  
  
  登录页



  

2、配置路由

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const {
    router,
    controller
  } = app;
  router.get('/', controller.home.index); //默认页
  router.get('/home', controller.home.getHome)
  router.get('/login', controller.home.login)
};

3、写首页和登录页方法

//home.js
'use strict'; //严格模式

const Controller = require('egg').Controller; //Controller类

class HomeController extends Controller { //定义一个新的类去继承Controller类
  async index() {
    const {
      ctx
    } = this;
   ctx.body="hi,egg"
  }

  //首页
  async getHome() {
    await this.ctx.render("home")
  }

  //登录页
  async login() {
    await this.ctx.render("login")
  }
}

module.exports = HomeController; //暴露HomeController

4、登录则访问首页,不登录访问不了首页

思路:用户登录的时候给个session,访问首页判断session,有session则访问首页,没有则重定向回登录页。

  • 首先需要在路由里面加一个post,提交按钮的方法(就在原本的router.js里面加下面的代码)
router.post('/login', controller.home.doLogin)
  • 在home.js里面加上doLogin方法(就在原本的home.js里面加上下面的代码)
 //登录
  async doLogin() {
    let userName = this.ctx.request.body.username
    let passWord = this.ctx.request.body.password
    if (userName == "xiaoming" && passWord == "123") {
      this.ctx.redirect("/home")
    } else {
      this.ctx.redirect("/login")
    }
  }

此时我们访问登录页,当我们输入xiaoming以及123的时候,我们就能跳转到首页,而当我们输入的并非这两者的时候,就会重新跳转到登录页

登录页
首页
  • 当我们加上session进行判断,存储用户名称,直接在地址栏去首页都会进行拦截判断
'use strict'; //严格模式

const Controller = require('egg').Controller; //Controller类

class HomeController extends Controller { //定义一个新的类去继承Controller类
//首页
  async getHome() {
    if (this.ctx.session.user) {
      await this.ctx.render("home")
    } else {
      this.ctx.redirect('/login')
    }

  }

  //登录页
  async login() {
    await this.ctx.render("login")
  }

  //登录
  async doLogin() {
    let userName = this.ctx.request.body.username
    let passWord = this.ctx.request.body.password
    if (userName == "xiaoming" && passWord == "123") {
      this.ctx.session.user = userName
      this.ctx.redirect("/home")
    } else {
      this.ctx.redirect("/login")
    }
  }
}

module.exports = HomeController; //暴露HomeController
  • 我们为了更完善一点,还要加上注销的功能,实现方式逻辑,就是点击注销,回到登录页面,我们就要清空session,这样回到登录页面,就不会重定向判断去首页了。
  1. router.js 加上注销的路由(在原本的router.js里面加上下面这一行即可)
 router.post('/logout', controller.home.logout)
  1. 在home.html上加上注销的表单事件(在原本的home.html下面加上这一行即可)
 
  1. 在home.js里面加上注销的方法(在原本的home.js里面加上下面这一行即可)
 //注销
  async logout() {
    this.ctx.session.user = ''
    this.ctx.redirect('/login')
  }
注销页面

尾语:那么本章就先讲session来实现登录的状态判断,因为怕文章太长,会耽误大家理解,所以就先分开来讲解,文章的末尾会放上传送门以及完整的代码。

完整的代码:

  • router.js
'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const {
    router,
    controller
  } = app;
  router.get('/', controller.home.index); //默认页
  router.get('/home', controller.home.getHome)
  router.get('/login', controller.home.login)
  router.post('/login', controller.home.doLogin)
  router.post('/logout', controller.home.logout)
};
  • login.html



  
  
  
  登录页


  
  • home.html



  
  
  
  首页


  
首页

-home.js

'use strict'; //严格模式

const Controller = require('egg').Controller; //Controller类

class HomeController extends Controller { //定义一个新的类去继承Controller类
  async index() {
    const {
      ctx
    } = this;
     this.ctx.body ='hi,egg'
  }

  //首页
  async getHome() {
    if (this.ctx.session.user) {
      await this.ctx.render("home")
    } else {
      this.ctx.redirect('/login')
    }

  }

  //登录页
  async login() {
    await this.ctx.render("login")
  }

  //登录
  async doLogin() {
    let userName = this.ctx.request.body.username
    let passWord = this.ctx.request.body.password
    if (userName == "xiaoming" && passWord == "123") {
      this.ctx.session.user = userName
      this.ctx.redirect("/home")
    } else {
      this.ctx.redirect("/login")
    }
  }

  //注销
  async logout() {
    this.ctx.session.user = ''
    this.ctx.redirect('/login')
  }

}

module.exports = HomeController; //暴露HomeController

那么本文到这里也就结束了,感谢大家的观看,推荐一首歌《Spin with you》

传送门:
1、第一章 Egg框架概述:https://www.jianshu.com/p/bfdaecb5a18c
2、第二章 路由与控制器:https://www.jianshu.com/p/62edeb088d76
3、第三章 插件:https://www.jianshu.com/p/e8d39f446f46

你可能感兴趣的:(Egg之用户登录状态(上))