所用技术:
前端:Vue(2.x)
、Vuex
、Vue-Router
、Nginx
、node.js
后端:jsp
其实我也不想纠结这个问题,但是业务逼着我纠结这个问题!(或许很多人甚至不认为这是一个问题!你们觉得呢?)也可能因为我就是一个纠结的人,但是我希望项目体验最好~~~
下面我列出了三种方案:
1.方案一:cookie(不设置过期时间)
个人不太喜欢这种方案,因为很多时候,我打开一个站点,登陆,复制url,然后关闭浏览器,粘贴url,还是能够访问的(不需要重新登陆),说明这些站点并未采用这种存储方式。欢迎补充你们的想法~~~
2.方案二:cookie(设置过期时间)
优点:过期浏览器自动删除
缺点:需要人为维护过期时间
缺点解决方案:如果用户在一定时间未使用系统(未交互),我们可以理解为,一定时间内用户没有向服务器发送请求,我们可以在axios
拦截里面修改cookie
的过期时间。
3.方案三:localStorage
重点是第三种方案,这也是项目目前采用的方式,但是因为业务导致我纠结了。
项目相关背景:
本地存储方式:localStorage
数据访问:axios,采用拦截器方式,如果api返回的代码为未登录,元素js跳转至登陆页面
业务需求:
用户登录成功(localStorage存储登录信息)——》判断是否设置支付密码(localStorage存储是否设置支付密码)——》如果已设置,跳转到主页;未设置,跳转到设置页。
成功跳转至主页(包含很多子页——子路由),基本每个子路由页面都会在进入后调用一些查询api,api拦截器里面返回如果未登录,再跳转至未登录。
需求就是这么简单,但是问题来了——有两种情况下显得问题比较“严重”
1、假设登录成功——》查询到未设置支付密码——》然后关闭浏览器,三天过后输入登录地址,因为localStorage未清空(也不能想cookie一样过期),所以会跳转到设置支付密码页面,因为这个页面不需要调用查询api,所以不会跳转至登录页,这个时候用户会输入“支付密码”,点击提交,然后会提示“用户未登录”,这样体验就不好了——用户的操作被浪费了……
2、三天过后,首页(包含登陆按钮)——》点击登陆,会自动跳到“设置支付密码”页面(注意,不是登录页哦),因为是已登录状态,用户设置支付密码保存——》又跳转到“登陆页”,这种情况太严重了,已客户的角度简直不可理解!
于是,我想到了cookie+设置过期时间的方式来处理,但是也有一些比较麻烦的事情;
- 每次交互(有api调用)都需要重新设置(多个)cookie的过期时间,虽然在拦截器里面可以处理,但是随着业务增加,可能需要更多的cookie;
- 并不是每个api调用都需要设置cookie的过期时间,例如:登陆失败,扫码,登陆时发送邮件api……,这样会显得非常凌乱;
那么,对于这种需求该如何进行本地存储才是最佳方案呢?
首先,是登录信息:
登录信息存在 cookie 中是一直以来的做法,而且实现的很好,不用考虑各种问题。
而 localStorage 是在这个 API 诞生之后,一些 JS 党带起来的另一种实现方式。
使用 localStorage,你需要在每次请求的时候,都手动带上这个信息,这大大增加了开发过程中带来的困难,非常麻烦,而且还要手动维护过期时间。
而使用 cookie 的话,只需要在后端的 Auth 模块放个设置 header 的代码即可,其他完全不用考虑。为什么:
设置 header 删除 cookie(可选步骤),并将用户重定向到登录页。若 cookie 有效,则设置 header,为 cookie 续期(cookie 内容都可以完全不变)。注意:只有请求 Auth 模块才会给 cookie 续期,其他模块不续。所以权限认证的模块都统一到一起了。
前端 js 什么都不用管,后端其他模块也什么都不用管。
然后是楼主的问题:
登录/设置密码:这是两个模块,不能搞混概念!然后有一个权限管理模块(Auth)来管理。
首先,必须要用户登录才能操作,这里不管你把登录信息存储到哪里。
登录成功后,有两种选择:
可以看出来,首页中判断是否设置了密码是必须的,而登录页不是。
那么,将判断代码放在首页,登录成功后进入首页,首页判断没有设置密码再跳到设置页,设置成功后,再跳转到首页。这个逻辑没有问题,也不会出现重复登录的问题。
我不知道楼主设置密码后为什么会跳转到登录页面?既然已经登录了,在设置密码后应该直接跳回首页啊?这应该是其他方面的逻辑问题,而不是登录信息存储方式的问题吧?
最后补充一点:关于什么时候用 cookie,什么时候用 ***Storage
注:上面的 ***Storage 包括了 localStorage 和 sessionStorage。
Cookie 存储的数据量比较小,所以一般不会存大量数据。当你存储的内容在每次请求后端的时候都需要的情况下才需要放到 Cookie 中。比如登录信息、设置信息之类的。
登录信息不用我说吧?肯定每次请求都要带上。
设置信息,一般比如网站语言(中文、英文之类的),或其他要求后端动态渲染的设置。
这个是新的 API,一般用于在前端缓存一些数据时使用,这些数据一般是只在前端使用,而后端不使用的,所以不用每次都往后端发送。(或是前端做统计,后端只要一个统计结果之类的)
比如一些网站提供的编辑器,自带草稿功能,每隔几秒钟或几分钟自动保存当前编辑的内容,刷新页面,或是把浏览器关掉重新打开编辑页面可以自动恢复之前编辑的内容的。
这种信息就适合存放在 ***Storage 中。
还有其他的比如 web SQL、IndexedDB 两个数据库,这一般是用来做 HTML 5 应用的时候才会用到的。比如 PWA 或是 HTML5 页游之类的。(贪玩蓝月跟这没关系(╯‵□′)╯︵┻━┻)
最后说一句:所有逻辑全部都放到前端判断是非常错误的决定!
因为:前端的一切都是可以手改的啊!
不管是 cookie、localStorage 还是 sessionStorage,只要用户按下 F12,分分钟手改啊!
这个网站要登录?打开 F12,输入
document.cookie='isLoggedIn=true';
或者localStorage.setItem('loggedIn', 'true');
,你就,登录成功???喵喵喵?要设置密码?同样打开 F12 设置点东西。
这些判断放在前端是完全没有意义的啊喂!因为你不管前端判断不判断,都要过一遍后端判断才行啊!!!
P.S. 当然,这里我就不提 CSP 之类的网站安全规则了。。。又扯远了。。。