Nuxt.js SSR与权限验证的实现


Posted in Javascript onNovember 21, 2018

Nuxt.js是一个建立在Vue.js基础上的服务端渲染框架。它非常易于上手并且可以让你在几分钟内构建你的应用。

服务端渲染是一个解决所有SPA的SEO问题的伟大解决方案,但不幸的是它带来了另一个问题:权限验证成了另一个项目管理中的痛点。

Nuxt.js官网提供了一个称为“路由鉴权”的示例(https://nuxtjs.org/examples/auth-routes)。它展示了如何通过一个中间件来限定一个页面是否可访问,但是这个检查是在客户端的进行的并且服务端渲染出的内容无论是否进行权限验证都是一样的。

那么我们如何在服务端渲染一个特定的内容呢?这里有一个解决方案!

服务端渲染通常是这样进行的:客户端发起一个请求,例如访问“/articles/page/1”,服务端渲染框架访问一个返回JSON数据的API然后生成页面并将其发送至客户端。

我们在这个过程中缺少的是指定一个token或者其他什么来进行权限验证的过程。或许一个包含权限token的Cookie是一个好办法,它能在头部被读取,因此我们的服务端渲染框架能传递它或是把它发送到API。

首先我们要创建两个插件:

import axios from 'axios'

let options = {};
if (process.SERVER_BUILD) {
 options.baseURL = `http://api:3030`
}

let ax = {
 options,
 create: (token) => {
 options.headers = {
  Authorization: token
 }
 return axios.create(ax.options)
 }
}

 export default ax

这个插件能让我们通过Axios发送带token的请求。

const getCookie = function(cname, req) {
 let name = cname + "="
 let decodedCookie
 if (typeof window === 'undefined') decodedCookie = decodeURIComponent(req.headers.cookie)
 else decodedCookie = decodeURIComponent(document.cookie)
 let ca = decodedCookie.split(';')
 for(let i = 0; i <ca.length; i++) {
  let c = ca[i]
  while (c.charAt(0) == ' ') {
   c = c.substring(1)
  }
  if (c.indexOf(name) == 0) {
   return c.substring(name.length, c.length)
  }
 }
 return ""
}
export default getCookie

这一个插件则是从Cookie中获取token。

接下来你就能在一个“async fetch”方法中简单地使用它们:

import axios from '~plugins/axios'
import getCookie from '~plugins/getCookie'
export default {
 async fetch ({ store, isServer, req, redirect }) {
  if(isServer) {
   const ax = axios.create(getCookie('token', req))
   try {
    let { data } = await ax.get('/populate')
    if(data.store && data.store.user) store.commit('user/setData', data.store.user)
    else redirect('/login')
   } catch(e) {}
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
根据json字符串生成Html的一种方式
Jan 09 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
jQuery简单实现中间浮窗效果
Sep 04 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
Dec 20 Javascript
原生JS实现图片轮播效果
Dec 26 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
如何选择适合你的JavaScript框架
Nov 20 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
Dec 13 Javascript
Vue导出页面为PDF格式的实现思路
Jul 31 Javascript
JQuery样式与属性设置方法分析
Dec 07 jQuery
react基本安装与测试示例
Apr 27 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
May 11 Javascript
详解nuxt路由鉴权(express模板)
Nov 21 #Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 #Javascript
Angular刷新当前页面的实现方法
Nov 21 #Javascript
详解ES6系列之私有变量的实现
Nov 21 #Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 #Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 #Javascript
You might like
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
JS实现的网页倒计时数字时钟效果
2015/03/02 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
python中类的一些方法分析
2014/09/25 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
python视频按帧截取图片工具
2019/07/23 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
python程序文件扩展名知识点详解
2020/02/27 Python
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
银行自荐信范文
2013/10/07 职场文书
会计助理岗位职责
2014/02/17 职场文书
清洁工工作总结
2015/08/11 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书
PL350与SW11的比较
2021/04/22 无线电
PHP实现两种排课方式
2021/06/26 PHP
用Python生成会跳舞的美女
2022/01/18 Python
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js