我想在我的网站上实时显示所有在线用户.不知道该如何解决这个问题.登录后添加新用户并不困难,但我还需要删除未登录的用户.

知道怎么做吗?我应该查看jQuery用户已经删除了什么并从列表中删除它们等?

您的问题将是人们在没有注销的情况下导航,他们的会话仍将存在,因为您的会话数据在收集之前已经设置了超时(实际上可能更长)

要准确计算谁登录并访问该站点,您需要每个客户端每隔几秒钟或几分钟向服务器发送一次“心跳”.在每个心跳触发器上,您希望在未分配的时间范围内使所有未签入的用户失效.

心跳信号可能最好由用户名和时间戳组成,但可能包含您要跟踪的任何信息.

当客户端向服务器发送单个数据库时,它会检查该用户名的现有记录,并在记录已存在时覆盖时间戳信息,否则添加新记录. Afterwords删除任何未签入的用户条目.可能最好让信号比到期时更频繁地发生.像每30秒发出一次信号并每分钟清理一次.

(编辑,改变主意,最好以相同的顺序而不是单独完成)
然后从活动表返回当前登录的用户,这将像SELECT * FROM表一样简单,因为表将始终是干净的.

客户端:

下面是一个客户端库的示例,用于处理触发心跳功能和捕获结果.

//Client-side parent variable declaration (simulated namespacing)
var Client = Client || {};
Client.pulse = null; //Holds a pointer to the heartbeat timer (id)
/* If you needed to cancel the heartbeat processes you Could
 * pass this variable to clearTimeout(). Calling Client.Heartbeat()
 * again would start the cycle back up.
 */

//Initial event that will kick off the chain when the DOM is ready
$(document).ready(function(){
  Client.Heartbeat(); //Initial call to the Heartbeat function
});//ready

/// Sends the heartbeat signal and retrieves the currently active user list
Client.Heartbeat = function(){
  var sUsername = 'SomeUser';
  /* Note: If you have an active session running on the server it would not be 
   * necessary to send the username since you Could pull it on the backend 
   * script which would be more tamper-proof anyway. I'm just giving an
   * example of sending data to the server using the jQuery.ajax method
   * If you were storing the username to be sent from the client; this wouldn't 
   * be a good place to do it anyway
   * 
   * Remove the "data : {...}" line below to exclude sending information to the server
   * The "type : 'post'" line would not be necessary either 
   */

  $.ajax({ //Send the signal and recieve the information about active users back
    url : '/lib/server/Heartbeat.PHP',type : 'post',dataType : 'json',data : {Username : sUsername },success : function(jActiveUsers,sstatus,jqXHR){ 
      /* This is the callback function of the request,jActiveUsers will be the 
       * json object with the information you choose to send back to it
       */
      Client.RenderActiveUsers(jActiveUsers); //Call the display function
      //Trigger the next delayed call to Client.Heartbeat
      Client.pulse = setTimeout(function(){
        Client.Heartbeat();
      },30000); //30 second delay before next trigger
    }//success
  });//$.ajax
}//Heartbeat

/// Processes the results sent by the server and draws them to the UI
Client.RenderActiveUsers = function(jActiveUsers){
  /* This is where you would get a handle whatever element(s) on the page
   * will be displaying the information about currently active users
   * and filling it with the list of users how ever you would wish to display it.
   */
}//RenderActiveUsers

因为你将处理异步回调setTimeout()调用在一个完整周期结束时重新启动进程将是一个更简洁的处理间隔的方法,如果你使用setInterval()并且服务器花了比预期更长的时间回来你可以看到客户开始竞争自己.在成功回调中使用setTimeout()还可以在服务器端心跳处理器停止工作时正常失败;客户端也是如此,而不是继续尝试失败(如果你想让它继续尝试你只需要在失败的响应上添加一个重新触发).

服务器端:

I apologize I am not familiar with Java as a back-end service,I will
be making some assumptions based on how PHP works; so I cannot
guarantee it will map directly to your environment.
Database examples will assume MysqL.
code examples will be pseudo-cody PHP(ish)

在服务器端,您将需要一个新表来跟踪活动用户.您可能已经在数据库中登录时进行跟踪,但这将与该系统分开(尽管您当然可以链接到该系统以获取返回结构的额外用户详细信息)

该表至少会看到以下内容:

ActiveUsers
 -----------------------------------------
 |   Field    |    Type     | NULL | Key |
 -----------------------------------------
 | Id         | int         |      | PRI |
 | Username   | varchar(xx) |      |     |
 | Lastpulse  | datetime    |      |     |
 | Firstpulse | datetime    |      |     |
 -----------------------------------------

(推测)我假设像PHP一样,Java中有Sessions,您可以使用它来存储特定访问者的信息,例如他们当前的状态.在PHP中,这通过在客户端和服务器之间来回传递标识符来工作,允许服务器识别特定客户端,并在后端存储与该会话相关的变量(例如,具有当前登录状态的布尔值)用户或登录后用于保存用户名的字符串.)

如果您可以使用它,那么处理身份验证的方式要比在客户端存储此信息更安全,并允许客户端指示是否以及登录的人员.这里假设它是….

当客户端将心跳发送到服务器时,如果它们事实上已登录以开始该过程,则可以从会话变量访问其登录状态和用户名.

if($LoggedIn && ($Username != null)){ //Session information

如果他们没有登录,您将跳到列表检索部分,因为您不需要为它们添加或修改记录

检查它们是否在活动表中有记录

SELECT `Id` FROM `ActiveUsers` WHERE `Username` = '{$Username}' LIMIT 1

如果存在记录,则表示它们之前已经签入,并且您希望使用从第一个查询返回的Id值使用新时间戳更新记录

UPDATE `ActiveUsers` SET `Lastpulse` = Now() WHERE `Id` = {$Id}

如果不存在记录,则需要为此用户创建一个新记录

INSERT INTO `ActiveUsers` (`Username`,`Lastpulse`,`Firstpulse`) VALUES ('{$Username}',Now(),Now())

接下来是该过程的维护阶段,您可以在该过程中清除未设置的任何条目,并将其设置为您要设置为限制的时间(本示例中为2分钟)

DELETE FROM `ActiveUsers` WHERE `Lastpulse` < (Now() - INTERVAL 2 MINUTE)

这将留下您的ActiveUsers表,以便只存在您可以查询以获取的活动用户的记录,以及您希望从此处以及您可以链接到的任何其他表中获得的任何其他信息

SELECT `Username`,UNIX_TIMESTAMP(`Firstpulse`) AS `Firstpulse` FROM `ActiveUsers` ORDER BY `Firstpulse` ASC

(在PHP中)然后,您需要遍历结果集并构建一个用户数组,通过调用json_encode()和print()以及“application / json”标头值将其转换为JSON,以便jQuery可以正确处理它.这当然会在实现中的Java之间有所不同,但“创建数组,将其转换为JSON字符串并使用指定的正确标头打印出来”的整个过程将是相同的.

理想情况下,您希望将客户端尽可能“愚蠢”地保留在任何类型的身份验证过程中.在此示例中,客户端盲目地检入服务器并仅通过询问活动用户的新列表来触发过期用户的清理.

如果100%准确的列表在高度利用的站点上是关键任务的,则可能需要在执行维护部分时锁定表.确保在另一个线程处于签入阶段时不会发生对用户列表的查询.

(哇,这变成了一个Wall-O-Text)

如何使用ajax显示在线用户的更多相关文章

  1. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  2. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  3. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  4. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  5. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. ajax从JSP传递对象数组到后台的方法

    今天小编就为大家分享一篇ajax从JSP传递对象数组到后台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  7. 解决ajax返回验证的时候总是弹出error错误的方法

    这篇文章主要介绍了解决ajax返回验证的时候总是弹出error错误的方法,感兴趣的小伙伴们可以参考一下

  8. 使用AJAX完成用户名是否存在异步校验

    这篇文章主要介绍了使用AJAX完成用户名是否存在异步校验的相关资料,需要的朋友可以参考下

  9. ajax实现无刷新省市县三级联动

    这篇文章主要为大家详细介绍了ajax实现无刷新省市县三级联动的相关资料,利用三层架构实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. jQuery Ajax 实现分页 kkpager插件实例代码

    本文通过实例代码给大家讲解了jQuery Ajax 实现分页 kkpager插件功能,需要的的朋友参考下吧

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部