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 相关文章推荐
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
YUI模块开发原理详解
Nov 18 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
Dec 14 Javascript
select多选 multiple的使用示例
Jun 16 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
js字符串截取函数slice、substring和substr的比较
May 17 Javascript
AngularJS实现星星等级评分功能
Sep 24 Javascript
Avalonjs 实现简单购物车功能(实例代码)
Feb 07 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
vue多个元素的样式选择器问题
Nov 29 Javascript
基于JavaScript实现随机点名器
Feb 25 Javascript
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
详解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
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
php中 ob_start等函数截取标准输出的方法
2015/06/22 PHP
PHP实现简单用户登录界面
2019/10/23 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
javaScript年份下拉列表框内容为当前年份及前后50年
2014/05/28 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
AngularJS 限定$scope的范围实例详解
2017/06/23 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
js中arguments对象的深入理解
2019/05/14 Javascript
jquery多级树形下拉菜单的实例代码
2019/07/09 jQuery
koa2 从入门到精通(小结)
2019/07/23 Javascript
VUE+elementui面包屑实现动态路由详解
2019/11/04 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
python 切片和range()用法说明
2013/03/24 Python
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python实现微信远程控制电脑
2018/02/22 Python
基于Python log 的正确打开方式
2018/04/28 Python
详解python中的json和字典dict
2018/06/22 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
python Selenium实现付费音乐批量下载的实现方法
2019/01/24 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
python uuid生成唯一id或str的最简单案例
2021/01/13 Python
html5 http的轮询和Websocket原理
2018/10/19 HTML / CSS
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2016年公司新年寄语
2015/08/17 职场文书
阳光体育运动标语口号
2015/12/26 职场文书
合作意向书怎么写
2019/06/24 职场文书
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers