目标

  •  判断用户登陆失效状态,并提示用户重新登陆

情况

  1. 页面请求需判断;
  2. 接口请求需判断;

方案

  1. 页面请求——通过server拦截器判断user状态,采用重定向到login;
  2. 接口请求(非页面请求)——通过ajax回调,得到server返回状态码,页面跳转login;
  3. comet方式——server 长链接方式 push user状态,跟进状态跳转login;
  4. socket方式——server 长链接方式(可听回),过滤器拦截请求,user状态失效,通过socket推失效状态给client跳转;

对比

  1. 页面请求——无法处理接口;
  2. 接口求情——需要在clent每个ajax端口写方法,维护困难;
  3. 方案1、2结合使用仍然维护困难;
  4. comet方式——维护简单,占用资源少;
  5. socket方式——维护简单,扩展性强(数据同步);

介绍

  •  comet?
    • 与ajax很像,ajax是一直请求,comet是反过来,一只推送;
    • 性能比ajax好,因为是长链接
  • 优点
    • 实时性好;
    • 简单;
  • 缺点
    • 只说话,不听话;
    • 不适合大数据量;
    • 进阶可以考虑socket(听话回话、大数据);
    • 不支持IE9以下;

结论

  • 使用socket.io,监听http,判断user状态,失效后推送失效状态给客户端,客户端拿到失效状态进行提示跳转;
  • 在做技术选型时,要从多维度分析利弊,考虑当前和以后扩展,进行平衡选择;

socket.io 原理!!!

  • 先要了解Websocket。H5之前http没状态,实时通讯除了flash,需要轮询向服务器取状态;H5有了Websocket,和socket一样(只是网络版);工作流程:js向服务端发建立请求,建立成功后,通过TCP进行通讯;
  • socket.io是否封装了websocket?
  • socket.io包含:
    • Websocket
    • 轮询兼容机制
      • Adobe® Flash® Socket  大部分PC浏览器都支持的socket模式,即将被淘汰;
      • AJAX long polling  定时的向服务器发送请求,缺点是会给服务器带来压力并且出现信息更新不及时的现象;
      • AJAX multipart streaming  这是在XMLHttpRequest对象上使用某些浏览器(比如说Firefox)支持的multi-part标志。Ajax请求被发送给服务器端并保持打开状态(挂起状态),每次需要向客户端发送信息,就寻找一个挂起的的http请求响应给客户端,并且所有的响应都会通过统一连接来写入
      • Forever Iframe  一个置于页面中的隐藏Iframe标签,该标签的src属性指向返回服务器端事件的servlet路径。每次在事件到达时,servlet写入并刷新一个新的script标签,该标签内部带有JavaScript代码,iframe的内容被附加上这一script标签,标签中的内容就会得到执行。这种方式的缺点是接和数据都是由浏览器通过HTML标签来处理的,因此你没有办法知道连接何时在哪一端已被断开了,并且Iframe标签在浏览器中将被逐步取消使用。
      • JSONP Polling   JSONP轮询基本上与HTTP轮询一样,不同之处则是JSONP可以发出跨域请求