IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> egg(十二):生成token设定有效期,egg+vue -> 正文阅读

[JavaScript知识库]egg(十二):生成token设定有效期,egg+vue

前言:

? ? ? ?使用 egg-jwt 来完成egg后台需要的 鉴权 ,生成token,发送给前端

目录:

后端部分:

1、安装插件,

2、配置plugin.js

3、在config.default.js配置,这里不推荐把后面的token中间件在这里引入,这里是的方法是全局方法,我们的token验证只是登录后的接口需要,其他不需要,我这里是按需判断

4、middleware / jwtErr.js? ,中间组件token校验,如果过期或者没有就返回前端给401错误

5、登录的接口,需要生成token,并配置有效时间

6、登录以后的接口,需要按需判断token,? router.js中按需配置

方法的第二个参数,加上jwtErr,就开始验证token了,不加就不验证

app.get('/setUserList',jwtErr, controller.new.user.getUserList)

前端部分:

1、登录部分获取我们后端的token

2、util.js方法,cookie方法,对token进行封装

3、axios的公共方法,响应拦截里面写方法

逻辑:在失败的方法里面,调用失败的处理函数,对401进行特殊处理,弹框提示,并踢到登录页面,清空cookie

4、axios的公共方法,请求拦截器,可以在这里里面,每次请求后端前,都把token加上,也可以在单独的方法里面


后端部分:

1、安装插件,

cnpm i egg-jwt --save

2、配置plugin.js

exports.jwt = {
  enable: true,
  package: 'egg-jwt',
};//生成token

3、在config.default.js配置,这里不推荐把后面的token中间件在这里引入,这里是的方法是全局方法,我们的token验证只是登录后的接口需要,其他不需要,我这里是按需判断

module.exports = appInfo => {
  /**
   * built-in config
   * @type {Egg.EggAppConfig}
   **/
  const config = exports = {};

加入下面这个

  //生成token
  config.jwt  = {
    secret: "haoxing" //秘钥
  };



}

4、middleware / jwtErr.js? ,中间组件token校验,如果过期或者没有就返回前端给401错误

//检查token
module.exports = (options) => {
  return async function jwtErr(ctx, next) {
    const token = ctx.request.header.authorization;
    let decode = '';
    if (token) {
      try {
        // 解码token
        decode = ctx.app.jwt.verify(token, options.secret);
        await next();
        console.log('decode======>',decode);
      } catch (error) {
        ctx.status = 401;
        ctx.body = {
          message: error.message,
        };
        return;
      }
    } else {
      ctx.status = 401;
      ctx.body = {
        message: '没有token',
      };
      return;
    }
  };
}

5、登录的接口,需要生成token,并配置有效时间


  let params = ctx.request.body   
    //需要存储的 token 数据
   let token_con = {
      'username': params.username,
      'password': params.password,
    }

  let term = (60 * 60 * 24) + 's' //token有效期,设置为24小时
  const token = app.jwt.sign(token_con, app.config.jwt.secret, { expiresIn: term });

6、登录以后的接口,需要按需判断token,? router.js中按需配置

/**
 * 路由配置
 * @param app
 */
module.exports = app => {
  //middleware 是中间件,就是能用到我们上面的方法
  const { router, controller, middleware } = app;
  const jwtErr = middleware.jwtErr(app.config.jwt) //检验token

  //用户信息-user  jwtErr加上就是验证token
  app.get('/setUserList',jwtErr, controller.new.user.getUserList);
  app.post('/setUserList', controller.new.user.postUserList);

}

方法的第二个参数,加上jwtErr,就开始验证token了,不加就不验证

app.get('/setUserList',jwtErr, controller.new.user.getUserList)

前端部分:

1、登录部分获取我们后端的token

import { setToken } from '@/utils/util.js'
axios({
    method:'post',
    url:你的地址,
    data:params
 }).then(res=>{
    if(res.data.code == 200){
       this.$message.success('登录成功')
       //储存token,我这里是
        setToken(res.data.data)
        //跳到首页
        this.$router.push({
            name: 'HomeIndex'
          })
   }else{
          this.$message.error(res.data.data)
          this.getImgTextUrl() //刷新验证码
        }
    })

2、util.js方法,cookie方法,对token进行封装

import Cookies from 'js-cookie'
// cookie保存的天数

export const TOKEN_KEY = 'NOW_TOKEN'

export const setToken = (token, cookieExpires) => {
  Cookies.set(TOKEN_KEY, token, { expires: cookieExpires || 1 })
}

export const getToken = () => {
  const token = Cookies.get(TOKEN_KEY)
  if (token) return token
  else return false
}

export const delToken = () => {
  Cookies.remove(TOKEN_KEY)
}

3、axios的公共方法,响应拦截里面写方法

逻辑:在失败的方法里面,调用失败的处理函数,对401进行特殊处理,弹框提示,并踢到登录页面,清空cookie

import axios from 'axios'
import ELEMENT from 'element-ui'
import router from '../router'
import { getToken,delToken } from './util.js'

// 添加响应拦截器-------------------------------------
axios.interceptors.response.use(res => {
  const { data, status, headers } = res
  console.log('@return-data:')
  console.log(data)
  // console.log('@return-headers:')
  //   // console.log(headers)
  return { data, status, headers }
}, error => {


  // 统一处理请求失败问题
  errorState(error)



  console.log('@error:')
  console.log(error)
  return Promise.reject(error)
});


// 封装数据返回失败提示函数------------------------------
function errorState(error) {
  let code = error.response.status
  if(  code === 401) {
    ELEMENT.Message.error('长时间未操作,需要重新登录!'  , 1);
    router.replace({
      name: 'Login'
    })

    delToken()

  }
}

4、axios的公共方法,请求拦截器,可以在这里里面,每次请求后端前,都把token加上,也可以在单独的方法里面

import axios from 'axios'
import { getToken} from './util.js'

axios.interceptors.request.use(config => {
  
  let token = getToken();
  if(token) {
    axios.headers['authorization'] =token
  };

  return config
},error => {
  // 请求错误时弹框提示
  return Promise.reject(error)
})

到此就结束了!

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:28:21  更:2021-10-30 12:31:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 5:53:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码