例如,我有一个登录页面A,一个主页面B。我想让用户在A页面登录后,正常跳转到B页面。而不允许用户直接用B页面的url来访问该页面。整个开发的框架:html+js+php+apache+mysql


cookie里记录一个sessionid,这个sessionid 由服务端来维护,我不知道你的这个case 是传统的 Web Page 还是 Web App,如果是 Web Page 在后端 Template Router 上做一个auth校验,如果访问的URL没有带这个 sessionid,那么不管访问哪个页面,都重定向到A页面。如果是Web App,依然可以在Route 这个层面做一个 auth 的hook 来进入B页面。


载入B时,先做个判断,如果用户没有登录信息,就重定向到A;如果用户有登录信息,那就正常载入B页面


实现方式太多了,用前端的一些框架,做前后分离,前端的url跳转都是js修改location,并不是真实访问这个页面,这也就意味著,这个页面其实是不存在的。那么用户如果直接访问这个页面会404

第二种方案,检查http头的Referer。如果发现不是你想要的来源,那么不返回数据


一般情况下如果是普通的html比较传统的就是使用session来控制,用户访问后检查用户session中记录的参数是否有登录,如果登录了就让他正常访问,如果未登录也跳转登录。如果还涉及集群的话话可以把session使用redis存储,不改变代码逻辑,直接在伺服器中做修改。

前后端分离的话可以使用token,用户无token或者token失效的话就认为用户未登录,系统判定则跳转登录页面,如果有token的话也执行检验逻辑,检验真实性,有效性等等,检验完成则正常跳转。这里面有肯多的策略可以操作,比如设置token的有效时间(也就是默认在线时长)等等。token可以存储在redis中,每次用户访问时都会先执行token校验模块,校验成功则正常跳转,检验失败则跳转登录并且返回相应的返回消息到页面。

我是一个java程序员,不过程序的理念应该都是想通的,在程序中设置一个通用访问代码块(拦截器)用户的每次请求默认执行该代码块,该代码块用来做校验token


不知道PHP有没有设置拦截器这一说法,按照普通套路是设置一个登录拦截器来拦截所有要经过登录的页面URL地址


如果用户直接访问B页面,那就再B页面载入之前首先载入一个判断本地是否有登录状态token的JS方法,如果没有直接跳转登录页A,如果有就可以成功访问B页面,那么A页面登录之后就需要你把用户的登录状态保存到本地localStorage里,退出登录把localStorage的token给removeItem就可以了。

以上是最表面的,如果考虑很多种情况的话,那就还要判断用户是否再其他设备上登录了,用户登录是否过期了,所以这里就算在B页面检测到了本地有token,也要再把这个token传给后台检验一下这个token是否过期,如果过期同理跳登录页。

以上。


推荐阅读:
相关文章