`
123003473
  • 浏览: 1061387 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

DWR 长连接方式的若干问题

    博客分类:
  • dwr
阅读更多
、服务器向指定客户端推送数据

完成聊天室之类的项目时,利用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长连接demo

    DWR通过建立持久的HTTP连接(长连接)来提高性能和用户体验,这种方式被称为 comet 技术。下面将详细阐述DWR长连接的工作原理、优势、配置以及如何创建一个简单的DWR长连接示例。 1. DWR长连接工作原理: DWR利用...

    DWR 长连接方式上传图片

    在DWR中,长连接方式上传图片是一种优化的文件上传策略,它通过保持一个持久的HTTP连接来减少网络延迟,提高用户体验。 首先,我们需要理解DWR的工作原理。DWR允许JavaScript直接调用服务器端的Java方法,这些调用...

    dwr 长连接

    DWR通过两种方式实现长连接:轮询(Polling)和心跳(Heartbeat)。 - **轮询**:客户端定时向服务器发送请求,检查是否有新的数据。这是一种简单但效率不高的方式,因为即使没有新数据,也会频繁地发送请求。 - **...

    dwr dwrdwr

    dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr

    DWR详解DWR详解DWR详解DWR详解

    2. **超时设置**: 设置连接的建立、读取、写入和空闲超时,以防止资源长时间被占用。 3. **并发控制**: DWR支持并发请求的限制,可以防止过多并发请求导致服务器过载。 4. **健康检查**: 定期检查连接状态,确保返回...

    DWR comet 长连接实现在线对话-简易版

    NULL 博文链接:https://happysoul.iteye.com/blog/1313069

    dwr与spring集成的方式

    ### dwr与spring集成的方式 #### 一、引言 DWR(Direct Web Remoting)是一种简化Ajax开发的Java框架,允许在客户端直接调用服务器端的Java方法,从而简化了传统的JavaScript编程复杂度。Spring作为一款流行的企业...

    dwr+spring 注解方式

    在使用DWR和Spring结合时,注解方式的引入极大地简化了配置过程。下面将详细介绍如何通过注解实现DWR和Spring的集成以及相关知识点: 1. **Spring注解配置**: - `@Configuration`:标记一个类为Spring配置类,可...

    Dwr+Hibernate的Lazy问题

    标题中的"Dwr+Hibernate的Lazy问题"涉及到两个主要技术:Direct Web Remoting (DWR) 和 Hibernate。DWR 是一种让 JavaScript 在浏览器中直接调用服务器端 Java 方法的技术,而 Hibernate 是一个流行的Java持久化框架...

    DWR中文文档DWR

    - 该中文文档将详细介绍DWR的安装、配置、使用方法以及常见问题的解决,是学习DWR的重要参考资料。 通过深入学习这份DWR中文文档,开发者不仅可以掌握DWR的基本用法,还能了解到如何在实际项目中有效利用DWR提升...

    DWR框架实例及常见问题解决办法,免费放送

    在这个压缩包中,"dwrTest"可能包含了一个DWR框架的实例,帮助开发者了解如何在实际项目中应用DWR,并提供了针对DWR框架常见问题的解决方法。 DWR的主要特点和优势包括: 1. **实时双向通信**:DWR允许服务器端...

    dwr demo dwr简单使用

    9. **安全考虑**:在实际项目中,使用DWR时需要注意安全性问题。暴露给JavaScript的服务器端方法可能会引发安全风险,因此需要谨慎设置DWR的访问权限,避免敏感数据和操作被不授权的用户调用。 通过这个简单的DWR...

    dwr笔记 dwr自学资料

    DWR (Direct Web Remoting) 是一种开源Java技术,它允许Web应用程序在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用服务器端的Java方法,极大地简化了客户端和服务器端的数据交换。本笔记将...

    dwr实现ajax功能ajax+dwr

    **DWR(Direct Web Remoting)**是一种Java技术,它允许Web应用程序在客户端与服务器之间进行实时通信,而无需刷新整个页面。通过DWR,我们可以使用JavaScript直接调用服务器端的Java方法,实现Ajax(Asynchronous ...

    DWR的学习资料,DWR学习必备

    tree.rar:这可能是一个目录结构的压缩文件,展示了DWR项目或者示例应用的文件组织方式。通过查看这个文件,你可以了解DWR项目通常是如何布局的,这对于理解和构建自己的DWR应用非常有帮助。 dwr.war:WAR(Web ...

    DWR中文文档 (DWR 2.0)

    **10.1 常见问题**:列举在使用DWR过程中可能会遇到的一些常见问题及其解决方案。 1. **TransformerFactoryConfigurationError**:解决方法可能是检查TransformerFactory的配置是否正确。 2. **XML解析错误**:通常...

    DWR框架学习demo

    DWR的核心在于其反向AJAX技术,它通过建立一个HTTP长连接,使得服务器端可以主动推送数据到客户端,而不仅仅是响应客户端的请求。 **1. DWR框架的核心组件** - **Engine**: 引擎是DWR的核心,负责处理所有与远程...

    一个简单dwr的使用例子,tomcat数据库连接池

    这个例子展示了如何在Web应用程序中使用DWR与Tomcat数据库连接池来实现Ajax交互,从而实现实时的客户端-服务器通信。 首先,我们需要了解DWR的基本工作原理。DWR允许JavaScript在用户的浏览器中直接调用服务器端的...

    Dwr入门操作手册Dwr

    Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr入门操作手册Dwr...

    DWR配置文件详解,DWR配置

    `creator`属性指定了创建对象的方式,`javascript`属性指定了JavaScript中的对象名称。 - **convert**: 定义数据类型转换,`converter`指定转换器类型,`match`定义匹配哪种类型的Java对象进行转换。 ### 3. ...

Global site tag (gtag.js) - Google Analytics