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 相关文章推荐
jQuery 常见开发使用技巧总结
Dec 26 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
js删除局部变量的实现方法
Jun 25 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
Aug 05 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
JS中input表单隐藏域及其使用方法
Feb 13 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
jQuery条件分页 代替离线查询(附代码)
Aug 17 jQuery
浅谈vue2 单页面如何设置网页title
Nov 08 Javascript
vue-cli项目无法用本机IP访问的解决方法
Sep 20 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
DOMXML函数笔记
2006/10/09 PHP
第1次亲密接触PHP5(2)
2006/10/09 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
javascrip关于继承的小例子
2013/05/10 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
浅析JavaScript中的对象类型Object
2016/05/26 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
2017/11/18 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
jQuery实现简易QQ聊天框
2020/02/10 jQuery
Python运用于数据分析的简单教程
2015/03/27 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python爬虫之自制英汉字典
2019/06/24 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
HTML5中的强制下载属性download使用实例解析
2016/05/12 HTML / CSS
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
秘书岗位职责
2013/11/18 职场文书
普通党员对照检查材料
2014/08/28 职场文书
个人年终总结开头
2015/03/06 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
考研英语辞职信
2015/05/13 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis