zoukankan      html  css  js  c++  java
  • 后端修改配置文件后,前端刷新页面--搭配鉴权

      背景:

      一个PC端的网站,用户登录后,网站显示的内容会根据该用户的在该网站中所设置的配置而有所不同,也就是说,每个用户在配置页面开启了和配置了不同的配置项,那么在首次访问该网站的首页时,显示的内容也会根据配置来选择显示或者隐藏。

      问题:

      因为是PC端,所以可以同时打开多个标签页,移动端也可以,只不过很少这样。该网站使用的HTTP协议,未使用WebSocket。

      第一次访问网站的时候,显示了可以进行的A,B,C三个操作,此时的标签页为one。

      然后打开一个新的标签页two,再访问一下该网站,此时标签页one和two的内容应该是一样的,如果不一样,就应该出问题了。

      然后在two中进入到配置界面,target为_blank,在配置页中进行操作,关闭A操作,保存之后,该用户再次访问该网站首页时,操作A应该是隐藏的。

      此时回到标签页one和two,你会看到A操作仍旧显示着,对吧,这个是正常的,因为没有刷新嘛。

      因为使用http协议,那么服务器就不能主动向客户端推信息,所以客户端如果不刷新的话,那客户端的内容就永远不会刷新。

      也许你会说使用ajax定时请求,这样也是能实现的,

      但是有这么些问题:

      1、如果用户当前网页是正在浏览什么某个内容,定时的ajax查询到配置变了,然后网页一刷新,那么用户当前浏览的内容就要再找一次,然后在浏览,这样的用户体验很不好。

      2、ajax定时请求要视情况而定,如果用户频繁的使用该网站还行,但是如果用户打开网站后,即离开了电脑,保持网页打开的状态,那么ajax定时请求就会消耗资源。

      3、对于上面这种情况,可能你会说ajax请求的时候,请求参数加一个请求的次数count,后端接收到这个count,把这个count加1,附带查询数据返回,前端收到count后,如果大于限定值时,就不在发起ajax请求了。这个在一定程度上可以达到目的,但是,如果count超过限定值,ajax不再请求,而此时用户从两个标签页中的随意一个页面进入配置界面,然后修改配置,如果另外一个标签页还在ajax请求,那么他就会更新页面,但是现在ajax不再请求了,那么他也就不会更新了,对吧

      

      解决方案:

      其实可以利用很简单的过程,就是咱们在每次接受用户请求的时候,都会鉴别该用户是否登录,是吧?

      鉴别用户是否登录,可以用两种方法:

      1、一种是在请求的时候鉴别

      2、一种是每次点击页面就ajax调用后端程序鉴别

      没错,其实咱们可以使用第二种方式,在用户每次点击页面的时候,阻止一切动作,而用ajax去请求后端程序是否已经登录,同时,再加上一些解决咱们问题的代码即可。

      具体实现:

      1、在user_info表中加一个字段,用来存用户访问网站时,那个时刻的配置信息,如果你感觉数据有点多,你可以采用MD5加密,或者sha1、base64编码之后再存。

      2、每次访问网站时,使用ajax访问一个接口AAA,该接口的功能就是:将用户的信息,以及配置信息保存到user_info中,如果可以的话,在缓存中存一份,当然,缓存不是必须的,但是建议这么做。

      3、每次点击网站页面的时候,假设是要进行A操作或者点击空白处,再使用ajax访问接口BBB,该接口的功能有两个:判断当前用户使用登录,如果登录,判断是否是否超过登录时长,这一步肯定要查user_info表或者缓存,也就将其中存的配置信息取出来了,但是并不能保证这是最新的,对吧;然后根据再查出最新的配置,将最新的配置和user_info或者缓存中的配置信息进行对比,如果不一样,则证明配置更新了,如果一样,则证明配置没有变。如果配置信息变了,那么返回一个值告诉前端刷新页面,否则执行请求的操作,也就是A操作。

      4、修改配置信息,于是配置信息变了,也就是说user_info和缓存中的配置信息不是最新的了。无论网页打开了多久,无论有多少个网页标签,只要进行任何点击操作,都会触发第三步的操作,结果就是刷新当前页面

      5、如果没有修改配置信息,那么缓存中或者user_info中的配置信息就是最新的,那么不会刷新页面,直接进行点击的操作即可。

      提示:

      实现的时候如果有问题,可以查询 切面编程、 拦截器

     

  • 相关阅读:
    TensorFLow手写字识别深度学习网络分析详解
    使用MSBUILD 构建时出错 error MSB3086: 任务未能使用 SdkToolsPath“”或注册表项“XXX”找到“LC.exe”,请确保已设置 SdkToolsPath。
    解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题
    SSH安装篇之——SecureCRT连接(内网和外网)虚拟机中的Linux系统(Ubuntu)
    git push 冲突
    ubuntu快捷键收集
    ubuntu中wine下安装QQ
    ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
    spring mvc添加静态资源访问时@Controller无效的解决
    git更新到远程服务器代码
  • 原文地址:https://www.cnblogs.com/-beyond/p/8961749.html
Copyright © 2011-2022 走看看