用户进入页面A,在页面A上要执行一个操做X。操做X须要用户登陆后才能访问,所以系统引导用户到登陆页,用户登陆后在让用户继续执行操做X。javascript
操做X存在两种状况,1:跳转到一个页面B;2:执行一个操做。php
进入页面B的状况,要在页面B的入口位置判断是否用户是否为登陆状态,是则进入,不然进入登陆页面,登陆成功后再进入页面B。假设页面A的URL是是url-a,页面B的url是url-b,登陆页面的url是url-l,那么浏览器的地址依次是url-a,url-b,url-l,url-b。所以,系统就是要解决登陆模版如何记录url-b,并在成功后进入url-b。前端
执行一个操做的状况。执行操做前判断用户的登陆状态,是则执行操做,不然先跳转到登陆页面,登陆成功后返回页面A,页面A继续执行以前的操做。这时,登陆页要记录页面A,登陆成功后返回A,页面A要记录用户的操做和参数,从登陆页返回后继续执行。java
页面跳转的状况,由页面B负责判断是否要跳转到登陆页,若是须要用redirect的方式完成。ajax
header("Location: $loginURL"); exit;
在login页面须要知道是从哪一个页面跳转来,并保存,这样登陆成功后再跳转回原来的页面。PHP中能够经过$_SERVER['HTTP_REFERER']得到是从哪一个页面进入的的登陆页。后端
$referer = $_SERVER['HTTP_REFERER'];
进入登陆页时得到的$referer必需要记录下来,才能在登陆成功后跳转回以前的页面。跨调用保存信息有4种方式:一、保存在session中;二、保存在cookie中;三、做为参数放在url中;四、生成页面时,做为页面的隐藏信息。浏览器
放在session中,只能经过php获取,所以,登陆成功后跳转回原页面的操做只能在php中进行,这样就不能实现经过一个ajax调用验证用户登陆信息后,在前端页面直接跳转指定页面。服务器
采用cookie的方式须要先后端共同肯定一个约定,用什么表明页面的跳转信息,另外前端须要增长cookie的处理逻辑。这种方式能够同时支持前端或后端进行跳转。cookie
做为参数放在url中能够实如今前端进行跳转,可是会致使url看起来有些怪异,同时还须要考虑url编码的问题。session
直接生成在登陆页面中(利用页面模版)做为前端参数,这种方式支持在前端进行跳转,须要先后端约定参数的定义。
执行操做的状况应该是页面A判断用户是否已经登陆,或者根据执行操做X的返回结果,由页面A直接跳转到登陆页面,登陆界面记录是从哪一个页面跳转来的。
header("Location: $loginURL"); exit;
页面A执行跳转到登陆页面前,首先记录要执行的操做,例如:操做的名称,这个信息必须能够跨请求访问。操做的相关信息能够经过url、session、cookie传递,或者经过localStorage、sessionStorage保留在客户端。
若是用url指定要执行的操做(用history.pushState替换url),只能携带简单的参数(放在history中是个好方法?没想明白),通用性很差。session和cookie须要向服务器端传数据,并且获取保留的参数并不方便。最后决定选择sessionStorage保存要执行的方法。
跳转到登陆界面前保存要执行的操做:
if (window.sessionStorage) { var method = JSON.stringify({ name: '要执行的方法的名称', args: [参数1,参数2] }); window.sessionStorage.setItem('pending.method', method); }
从登陆界面跳转回页面,取出要执行的操做并执行:
if (window.sessionStorage) { var pendingMethod; if (pendingMethod = window.sessionStorage.getItem('pending.method')) { window.sessionStorage.removeItem('pending.method'); pendingMethod = JSON.parse(pendingMethod); window[pendingMethod.name].apply($scope, pendingMethod.args || []); } }
总结,采用的方式是经过HTTP_REFERER和cookie记录登陆后要跳转的页面,经过sessionStorage记录返回页面后要执行的javascript方法和参数。