vue-router路由参数刷新消失的问题解决方法


Posted in Javascript onJune 17, 2017

场景:vue-router实现的单页应用,登录页调用登录接口后,服务器返回用户信息,然后通过router.push({name: 'index', params: res.data})传给主页组件,并在主页显示数据。但是刷新页面后,数据就消失了。

解决方案:

1、session&服务器渲染

传统的方案是,登录页和主页是单独的两个页面,登录成功后服务器生成用户信息对应的session,然后渲染主页数据,并通过响应头将sessionid传给浏览器并生成相应的cookie文件。这样下次请求页面时,浏览器会在http header带上相应的cookie,然后服务器根据cookie中的sessionid判断用户是否登录,再显示用户数据。
 如果项目采用前后端分离思想,服务器只提供接口,不进行服务器渲染,那么这种办法是行不通了。

2、$route.query

我们可以在路由跳转的时候带上登录请求的参数:

router.push({name:'index', query:{username: 'xxx', password: 'xxxxxx'}})
...
this.$ajax({
 url: 'xxx',
 method: 'post',
 data: {
  username: this.$route.query.username,
  password: this.$route.query.password
 }
})

这样登录参数会被保存在url中,像这样:“http://xxx.xxx.xxx/index?username=xxx&password=xxxxxx”,然后在created钩子中调用登录接口来返回数据。

即使密码进行了md5加密,将用户名密码这类敏感信息放在url中肯定也是不合理。

3、cookie

另一个办法是把登录参数存入cookie,然后在created钩子中获取cookie中存的信息,再调用登录接口。将用户名密码存入cookie中同样不合理,改进版是登录成功后服务器返回一个token,在有效期内通过token获取用户数据。

cookie存取数据比较麻烦,因为cookie中键值对是字符串并以 "=" 链接,需要额外写操作cookie的方法。

<script>
 function setCookie (name, value, exdays) {
  let date = new Date()
  date.setTime(date.getTime() + (exdays * 24 * 60 * 60 * 1000))
  let expires = "expires=" + date.toGMTString()
  document.cookie = name + "=" + value + "; " + expires
 }
 function getCookie (name) {
  name = name + "="
  let cookieArr = document.cookie.split(';')
  for (let i = 0; i < cookieArr.length; i++) {
   let cookie = cookieArr[i].trim()
   if (cookie.indexOf(name) === 0) {
    return cookie.slice(name.length)
   }
  }
  return ""
 }

4、HTML5 Web存储

提到Web存储,潜意识肯定觉得很多浏览器都不支持,其实IE8及以上都支持localStorage和sessionStorage了。Vue项目最低支持IE9,所以可以放心的使用Web存储。

localStorage存储数据没有时间限制,不主动删除就不会失效。而sessionStorage是在页面或者浏览器关闭时就会失效,适合本场景应用。

我们可以把token信息存在sessionStorage中,然后每次刷新页面通过token请求数据;但是既然能够把token存储到本地,为什么不直接把常用的数据直接保存到本地呢?利用本地数据,可以减少客户端网络请求,还可以降低服务器负担。

由于localStorage和sessionStorage是只读的,不能直接将其指向一个对象。也不能利用Object.assign()复制对象,因为值会变成字符串"[object Object]",所有只有通过循环为 sessionStorage 添加属性了。

...
for (var key in res.data.customer) {
 sessionStorage[key] = res.data.customer[key]
} 
...

以上是我在最近工作中遇到的问题,最后采用的方案是使用sessionStorage存储数据。

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

Javascript 相关文章推荐
在html页面上拖放移动标签
Jan 08 Javascript
几个有趣的Javascript Hack
Jul 24 Javascript
浅谈checkbox的一些操作(实战经验)
Nov 20 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
Feb 28 Javascript
JavaScript中实现sprintf、printf函数
Jan 27 Javascript
jquery获取select选中值的方法分析
Dec 22 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
jQuery多选框选择数量限制方法
Feb 08 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
JS实现打砖块游戏
Feb 14 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
Aug 28 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 Javascript
JS实现商品筛选功能
Aug 19 #Javascript
node文件上传功能简易实现代码
Jun 16 #Javascript
详解webpack 多入口配置
Jun 16 #Javascript
requirejs + vue 项目搭建详解
Jun 16 #Javascript
jQuery 控制文本框自动缩小字体填充
Jun 16 #jQuery
jQuery序列化后的表单值转换成Json
Jun 16 #jQuery
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 #Javascript
You might like
在PHP的图形函数中显示汉字
2006/10/09 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
JavaScript 原型学习总结
2010/10/29 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
javascript工具库代码
2012/03/29 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
javascript基本语法
2016/05/31 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
js类的继承定义与用法分析
2019/06/21 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
探究Python中isalnum()方法的使用
2015/05/18 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
python实现神经网络感知器算法
2017/12/20 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
python利用Opencv实现人脸识别功能
2019/04/25 Python
python3多线程知识点总结
2019/09/26 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
医学院毕业生自荐信
2013/11/08 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
工作鉴定评语
2014/05/04 职场文书
金融管理专业求职信
2014/07/10 职场文书
装配出错检讨书
2014/09/23 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
HAM-2000摩机图
2021/04/22 无线电
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python