解决 VUE 微信登录验证 【感谢原文:https://segmentfault.com/a/1190000009493199】
【感谢原文:https://segmentfault.com/a/1190000009493199】
SPA单页应用中微信授权登录的一点思路
单页应用应该如何解决微信授权登录的尴尬跳转?后退无法返回?
主要遇到的问题就是
先进入单页应用,一边渲染页面一边判断用户有没有登录,当判断到没有登录时异步数据请求已经发送出去了,然后要跳转到微信授权页面,这样就浪费了一次网络请求且用户可能要去点击这个数据了结果...跳走了!在授权成功后用户点击后退再次进行授权有没有???
本文主要讲述
对于单页应用应该在哪个阶段获取微信授权?
只考虑网站完全依赖微信授权登录,一进入就要以授权的身份进入
基本思路
核心是需要有个author.vue 叫它授权中间页好了
vue开发过程中的一些点子
由于我的业务是完全依赖微信授权登录的,也就是用户一进来就应该是已经完成授权的
为了避免让用户明显感觉到先进入网站然后又跳转到微信授权页面
我们从vue-router下手
基本实现思路是:
无论使用哪个url进入网站都会先触发router.beforeEach钩子
在router.beforeEach钩子中判断用户当前登录状态
若没有登录则保存用户进入的url并跳转到author授权页面
author授权页面完成微信授权以及token的写入实现用户登录
获取前面保存的用户进入url并跳转
经过这样一个流程,用户感觉到的就是,无论从哪个url进入SPA,都会先显示author页面,然后再进入自己想要进入的页面,而不是先进入自己想要进入的页面再闪到author页面,这样不仅节省了资源也提升了用户体验,更重要的一点是!我们的项目多了一个广告页面(无语...)!!!
先贴上我的实现代码
用户信息保存在Vuex中
// holdno是我自己定义的一个工具集 里面有各种操作方法
router.beforeEach((to, from, next) => {
if(to.path == '/author' && store.state.user.id){
// 用户使用后退返回到授权页,则默认回到首页
next('/index')
return false
}
if((!holdno.cookie.get('user') || !store.state.user.id) && to.path != '/author'){
// 第一次进入项目
holdno.cookie.set('beforeLoginUrl', to.fullPath) // 保存用户进入的url
next('/author')
return false
}else if(!store.state.user.id && to.path != '/author'){
// 之前有获取过授权
next('/author')
return false
}
next()
})
下面来看一下author页面的处理逻辑
created () {
// 检测会员有没有登录
if(!holdno.cookie.get('user')){
let ua = window.navigator.userAgent.toLowerCase()
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
// 跳转到微信授权页面
window.location.href = this.webUrl + '/Wap/User/getOpenid'
}
}else{
// 如果有token 但是vuex中没有用户登录信息则做登录操作
this.login()
}
},
methods: {
login () {
let url = this.webUrl + '/Wap/User/info'
// 通过cookie中保存的token 获取用户信息
this.$http.get(url).then(response => {
response = response.body
if(response){
// 保存用户登录状态(Vuex)
this.$store.commit('user', response)
setTimeout(() => {
this.goBeforeLoginUrl() // 页面恢复(进入用户一开始请求的页面)
}, 2000)
}else{
this.$alert('服务器撸猫去惹 :(', 'wrong')
if(holdno.cookie.get('user')){
// 跳转到微信授权页面
window.location.href = this.webUrl + '/Wap/User/getOpenid'
}
}
})
}
}
上述代码中 window.location.href = this.webUrl + '/Wap/User/getOpenid'
这一段是后端请求微信授权登录接口的地址,在后端获取到用户信息及openid后再次跳转到author页面而不是直接定向到用户想要请求的位置,这样做的原因很简单。
如果用户跳转到授权页面,由后端获取用户信息并保存好登录状态,重定向到用户请求的页面,这时只要用户点击一下后退,所有的逻辑重新再来一遍有没有?作为一个不懂技术的用户,应该也是很郁闷,为什么后退还是跳回来了呢???
所以获取用户信息后再次重定向到author页面,由author做一个中间页检测到获取到用户信息后在前端做一个跳转,也就是代码中的this.goBeforeLoginUrl()(跳转到登录前的url ...哈哈哈),这时候用户再点击后退就会退回到author页面而不是后端获取用户openid的url,但真的会再次显示author页面给用户吗?并不会,回看我们路由钩子的定义:
router.beforeEach((to, from, next) => {
if(to.path == '/author' && store.state.user.id){
// 用户使用后退返回到授权页,则默认回到首页
next('/index')
return false
}
...
})
后面部分这里不重要,展示出来的则是关键部分,在再次跳转至author前,路由钩子被触发,检测到即将进入的页面to.path == '/author'成立同时刚才在this.login()中做了this.$store.commit('user', response)操作,所以if条件成立页面被直接跳转至'/index'首页,所以在这一个流程中,用户并没有再次看到授权页面,而是直接返回到了首页,是不是很完美!
this.goBeforeLoginUrl()
// 登录后跳转方法
Vue.prototype.goBeforeLoginUrl = () => {
let url = holdno.cookie.get('beforeLoginUrl')
if(!url || url.indexOf('/author') != -1){
router.push('/index')
}else{
if(url == '/'){
url = '/index'
}
router.push(url)
holdno.cookie.set('beforeLoginUrl', '')
}
}
看完整个流程,author只讲到逻辑处理,但它毕竟是一个页面,也是要展示给用户看的,只处理逻辑的话难道白花花的一片show给用户吗?当然不是!想必大家都了解app在初次启动时都有一个广告页吧,我们完全可以把author授权中间页包装成一个广告页,在用户浏览花哨的图片(广告)时默默完成授权登录的处理 :)
至于这个图这么丑...额 只是想临时做个示例,所以...
大概就是这么个意思 :P
扫码体验(demo阶段)
希望能有大神交流更优解决方案。
解决 VUE 微信登录验证 【感谢原文:https://segmentfault.com/a/1190000009493199】的更多相关文章
- Vue elelment登录验证 简单版
http.js import axios from 'axios' import { Message, Loading } from 'element-ui'; import router from ...
- 微信开放平台--》网站应用开发 微信登录网站接口(https://open.weixin.qq.com/)
地址:https://open.weixin.qq.com/ 手册:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&am ...
- 解决 VUE 微信 IOS 路由跳转问题
watch: { "$route"(){ if (/iPhone|mac|iPod|iPad/i.test(navigator.userAgent)) { location.hre ...
- 网站微信登录授权 ASP.NET
最新做一些项目都有微信登录注册什么的,今天就把自己整理的demo提供给大家 微信认证流程(我自己简称三次握手): 1.用户同意授权,获取code 2.通过code换取网页授权access_token, ...
- Vue微信自定义分享时安卓系统config:ok,ios系统config:invalid signature签名错误,或者安卓和ios二次分享时均config:ok但是分享无效的解决办法
简述需求:要求指定页面可以进行微信自定义分享(自定义标题,描述,图片,链接),剩下的页面隐藏所有基础接口.二次分享依然可以正常使用,切换至其他页面也可以正常进行自定义分享. 这两天在做微信自定义分享的 ...
- vue之微信登录
参考文章https://www.cnblogs.com/examine/p/4634947.html 微信开放平台和公众平台的区别1.公众平台面向的是普通的用户,比如自媒体和媒体,企业官方微信公众账号 ...
- Vue-router hash模式微信登录授权验证,#号处理
微信授权登录验证会把网址中的#号去掉,这样在跳转的时候Vue拿不到Code.所以做了以下处理 let href = window.location.href; if (href.includes(&q ...
- 【笔记】vue+springboot前后端分离实现token登录验证和状态保存的简单实现方案
简单实现 token可用于登录验证和权限管理. 大致步骤分为: 前端登录,post用户名和密码到后端. 后端验证用户名和密码,若通过,生成一个token返回给前端. 前端拿到token用vuex和lo ...
- vue,一路走来(5)--微信登录
微信登录 今天又是周末了,想着博客还没记录完成.是的,下面记录一下微信登录遇到的问题. 在我的项目中,个人中心是需要完成授权登录才可以访问的,首先在定义路由的时候就需要多添加一个自定义字段requir ...
随机推荐
- Linux fdisk命令操作磁盘(添加、删除、转换分区等)
创建分区1->查看原始分区sudo fdisk -l Disk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, ...
- SpringBoot Maven项目 Helloworld 测试
SpringBoot 化繁为简,简化配置 SpringBoot官方:http://projects.spring.io/spring-boot/SpringBoot使用介绍:http://blog.c ...
- Vim正则表达式匹配替换字符串
/********************************************************************** * Vim正则表达式匹配替换字符串 * 说明: * 用V ...
- 【机器学习基础】SVM实现分类识别及参数调优(二)
前言 实现分类可以使用SVM方法,但是需要人工调参,具体过程请参考here,这个比较麻烦,小鹅不喜欢麻烦,正好看到SVM可以自动调优,甚好! 注意 1.reshape的使用: https://docs ...
- PTA 6-12 (二叉树的递归删除)
BinTree Insert( BinTree BST, ElementType X ) { if (BST==NULL) { BinTree tmp=(BinTree)malloc(sizeof(s ...
- 20155208徐子涵 2016-2017-2 《Java程序设计》第7周学习总结
20155208徐子涵 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1 认识时间与日期 就目前来说,即使标注为GMT(无论是文 ...
- 初始While循环和for循环
While循环 While循环,是一个循环加判断的组合,满足判断条件返回 真(True)开始循环代码块,不满足判断条件返回 假(False)不循环 格式: While 条件: 代码块 注意:在Whil ...
- Redis(一)入门
最近,学习了一下,Redis 这个Nosql数据库,从安装到基本语法,作为入门.下面,整理一下基本知识. 参考的地址如下: http://www.runoob.com/redis/redis-java ...
- 踩坑tomcat8.5的cookie机制
https://www.pomelolee.com/1601.html tomcat升级到8.5版本 发现登录和退出报错,报错日志为下 [http-nio-8080-exec-20] 2016 Aug ...
- MongoDB内存配置 --wiredTigerCacheSizeGB
用top命令查看系统占用内存的情况 top -p $(pidof mongod),发现mongod占用了8G内存的35.6%.在服务器上运行两个mongod进程,很容易导致mongod异常退出. 一度 ...