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 相关文章推荐
javascript内存管理详细解析
Nov 11 Javascript
javascript读写json示例
Apr 11 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
Jul 06 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
Ionic如何创建APP项目
Jun 03 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
Jan 13 Javascript
js获取当前周、上一周、下一周日期
Mar 19 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
微信小程序绑定手机号获取验证码功能
Oct 22 Javascript
Vue.js中使用Vuex实现组件数据共享案例
Jul 31 Javascript
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
js 执行上下文和作用域的相关总结
Feb 08 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
mysql 全文搜索 技巧
2007/04/27 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
在WordPress的文章编辑器中设置默认内容的方法
2015/12/29 PHP
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
php命令行写shell实例详解
2018/07/19 PHP
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
ExtJS 入门
2010/10/29 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
python合并文本文件示例
2014/02/07 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
python微信公众号之关键词自动回复
2018/06/15 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
如何在Django项目中引入静态文件
2019/07/26 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
本科毕业生专业自荐书范文
2014/02/05 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
MySQL学习必备条件查询数据
2022/03/25 MySQL
基于docker安装zabbix的详细教程
2022/06/05 Servers
Django框架之路由用法
2022/06/10 Python