、服务器向指定客户端推送数据
完成聊天室之类的项目时,利用DWR推模式向所有客户端推送数据,的确是很方便,只要客户端的访问页面确定就可以了。但是,若需要对访问同一页面的两个客户端(特别是根据用户身份作不同处理),加以区分,推送不同数据时,就没这么简单了。
有两种方式可以解决这个问题:
a)、服务端不处理,只管往客户端推送数据,由客户端对收到的数据进行过滤,然后再显示出来。但这种方式的缺点很明显,数据包多且不安全。
b)、对每个客户端进行单儿标识。DWR中以ScriptSession来代表一个客户端连接,我们可以通过设置ScriptSession的属性,来达到标识客户端的作用。如将sessionid或用户登录名保存在相应的ScriptSession属性中,向客户端推送数据时,根据这个属性加以过滤。相应的代码片段如下:
/**
* 返回有效的ScriptSession.
* @param user
* @return
*/
@SuppressWarnings("unchecked")
private ScriptSession getCurrentSession(String user){
ScriptSession xSession = null;
Collection<ScriptSession> sessions = new HashSet<ScriptSession>();
sessions.addAll(sctx.getScriptSessionsByPage(PAGE_MAIN));
for (ScriptSession session : sessions) {
//查询与消息接收者相符的客户端页面,并输出消息内容
String xuser = (String)session.getAttribute(SESSION_ATTRNAME_USER);
if(xuser != null && xuser .equals(user)){
xSession = session;
}
}
return xSession;
}
/**
* 清除已有连接, 标识当前连接用户(登录或刷新页面时,进行必要的清理).
* @param user
* @param session
*/
private void cleanDwrConnection(user,ScriptSession session){
String jid = StringUtils.parseBareAddress(user);
ScriptSession oldSession = getCurrentSession(jid);
if(oldSession != null && oldSession != session){
oldSession.invalidate();
oldSession = null;
}
session = WebContextFactory.get().getScriptSession();
session.setAttribute(SESSION_ATTRNAME_USER, jid);
}
2、使用DWR推模式的实现中,刷新页面引起长连接丢失问题
最近在做web版即时消息客户端时,遇到这样一个问题:为了减少无用的服务连接,只在登录后才激活长连接(dwr.engine.setActiveReverseAjax(true),注销后取消长连接)。登录客户端后,用了一段时间后,无法收消息了(消息无法推送到客户端)。后来调试后,发现ScriptSession实例没有绑定物理连接信息(conduits:m:root为空)。测试后发现,当刷新页面后,会产生一个新的ScriptSession实例,而这个ScriptSession的conduits:m:root为空,所以怎么都无法将数据推送到客户端去了。
客户端激活长连接后(dwr.engine.setActiveReverseAjax(true);),对应的ScriptSession实例会绑定物理连接信息,而刷新页面刷新而不重新激活长连接,新产生的ScriptSession是没有绑定物理连接信息的,一旦绑定物理连接信息的ScriptSession被销毁后,就产生了这个问题。
实现网络聊天室思路::
流程:
1、页面产生javascript的sessionId---将当前页面的用户ID和javascript的sessionId一同放入hashmap。
2、刷新页面 又有新的javascript的sessionId。
3、通过主键key 就是用户ID找到其对应的value值,将其value值替换成新生成的javascript的sessionId。
就是这样,这个dwr推 中的一个bug,目前新版本可以解决这个问题。
只能自己写个方法
ScriptSession不同,第一次访问,会创建一个ScriptSession,但是,如果你刷新,就会创建一个新的ScriptSession
分享到:
相关推荐
DWR通过建立持久的HTTP连接(长连接)来提高性能和用户体验,这种方式被称为 comet 技术。下面将详细阐述DWR长连接的工作原理、优势、配置以及如何创建一个简单的DWR长连接示例。 1. DWR长连接工作原理: DWR利用...
在DWR中,长连接方式上传图片是一种优化的文件上传策略,它通过保持一个持久的HTTP连接来减少网络延迟,提高用户体验。 首先,我们需要理解DWR的工作原理。DWR允许JavaScript直接调用服务器端的Java方法,这些调用...
DWR通过两种方式实现长连接:轮询(Polling)和心跳(Heartbeat)。 - **轮询**:客户端定时向服务器发送请求,检查是否有新的数据。这是一种简单但效率不高的方式,因为即使没有新数据,也会频繁地发送请求。 - **...
dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr
2. **超时设置**: 设置连接的建立、读取、写入和空闲超时,以防止资源长时间被占用。 3. **并发控制**: DWR支持并发请求的限制,可以防止过多并发请求导致服务器过载。 4. **健康检查**: 定期检查连接状态,确保返回...
NULL 博文链接:https://happysoul.iteye.com/blog/1313069
### dwr与spring集成的方式 #### 一、引言 DWR(Direct Web Remoting)是一种简化Ajax开发的Java框架,允许在客户端直接调用服务器端的Java方法,从而简化了传统的JavaScript编程复杂度。Spring作为一款流行的企业...
在使用DWR和Spring结合时,注解方式的引入极大地简化了配置过程。下面将详细介绍如何通过注解实现DWR和Spring的集成以及相关知识点: 1. **Spring注解配置**: - `@Configuration`:标记一个类为Spring配置类,可...
标题中的"Dwr+Hibernate的Lazy问题"涉及到两个主要技术:Direct Web Remoting (DWR) 和 Hibernate。DWR 是一种让 JavaScript 在浏览器中直接调用服务器端 Java 方法的技术,而 Hibernate 是一个流行的Java持久化框架...
- 该中文文档将详细介绍DWR的安装、配置、使用方法以及常见问题的解决,是学习DWR的重要参考资料。 通过深入学习这份DWR中文文档,开发者不仅可以掌握DWR的基本用法,还能了解到如何在实际项目中有效利用DWR提升...
在这个压缩包中,"dwrTest"可能包含了一个DWR框架的实例,帮助开发者了解如何在实际项目中应用DWR,并提供了针对DWR框架常见问题的解决方法。 DWR的主要特点和优势包括: 1. **实时双向通信**:DWR允许服务器端...
9. **安全考虑**:在实际项目中,使用DWR时需要注意安全性问题。暴露给JavaScript的服务器端方法可能会引发安全风险,因此需要谨慎设置DWR的访问权限,避免敏感数据和操作被不授权的用户调用。 通过这个简单的DWR...
DWR (Direct Web Remoting) 是一种开源Java技术,它允许Web应用程序在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用服务器端的Java方法,极大地简化了客户端和服务器端的数据交换。本笔记将...
**DWR(Direct Web Remoting)**是一种Java技术,它允许Web应用程序在客户端与服务器之间进行实时通信,而无需刷新整个页面。通过DWR,我们可以使用JavaScript直接调用服务器端的Java方法,实现Ajax(Asynchronous ...
tree.rar:这可能是一个目录结构的压缩文件,展示了DWR项目或者示例应用的文件组织方式。通过查看这个文件,你可以了解DWR项目通常是如何布局的,这对于理解和构建自己的DWR应用非常有帮助。 dwr.war:WAR(Web ...
**10.1 常见问题**:列举在使用DWR过程中可能会遇到的一些常见问题及其解决方案。 1. **TransformerFactoryConfigurationError**:解决方法可能是检查TransformerFactory的配置是否正确。 2. **XML解析错误**:通常...
DWR的核心在于其反向AJAX技术,它通过建立一个HTTP长连接,使得服务器端可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 **1. DWR框架的核心组件** - **Engine**: 引擎是DWR的核心,负责处理所有与远程...
这个例子展示了如何在Web应用程序中使用DWR与Tomcat数据库连接池来实现Ajax交互,从而实现实时的客户端-服务器通信。 首先,我们需要了解DWR的基本工作原理。DWR允许JavaScript在用户的浏览器中直接调用服务器端的...
Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr...
`creator`属性指定了创建对象的方式,`javascript`属性指定了JavaScript中的对象名称。 - **convert**: 定义数据类型转换,`converter`指定转换器类型,`match`定义匹配哪种类型的Java对象进行转换。 ### 3. ...