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 相关文章推荐
Javascript打印网页部分内容的脚本
Nov 17 Javascript
关于Mozilla浏览器不支持innerText的解决办法
Jan 01 Javascript
jQuery 获取URL的GET参数值的小例子
Apr 18 Javascript
javascript常见操作汇总
Sep 03 Javascript
js改变embed标签src值的方法
Apr 10 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
JavaScript实现瀑布流图片效果
Jun 30 Javascript
ejsExcel模板在Vue.js项目中的实际运用
Jan 27 Javascript
原生js封装的ajax方法示例
Aug 02 Javascript
mpvue开发音频类小程序踩坑和建议详解
Mar 12 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
JQuery表单元素取值赋值方法总结
May 12 jQuery
详解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_multisort()函数的使用札记
2011/07/03 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
js实现简单的购物车有图有代码
2014/05/26 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
windows环境中利用celery实现简单任务队列过程解析
2019/11/29 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
python实现猜拳游戏项目
2020/11/30 Python
函授本科毕业自我鉴定
2013/10/09 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js