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实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
什么是JavaScript
Aug 13 Javascript
jQuery+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
js获取当月最后一天实例代码
Nov 19 Javascript
变量声明时命名与变量作为对象属性时命名的区别解析
Dec 06 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
Oct 16 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
Jul 17 Javascript
Javascript中弹窗confirm与prompt的区别
Oct 26 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
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 dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
IE与FireFox中的childNodes区别
2011/10/20 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
AngularJS监听路由的变化示例代码
2016/09/23 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python中datetime模块中strftime/strptime函数的使用
2018/07/03 Python
python实现文件的分割与合并
2019/08/29 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
vue常用指令代码实例总结
2020/03/16 Python
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
妇科医生自荐信
2013/11/05 职场文书
教师自我鉴定
2013/12/13 职场文书
麦当劳辞职信范文
2014/01/18 职场文书
高中美术教学反思
2014/01/19 职场文书
优秀交警事迹材料
2014/01/26 职场文书
优秀学生评语大全
2014/04/25 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL