传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郝永亮 黑马程序员官方团队   /  2019-1-10 20:04  /  103 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郝永亮 于 2019-1-10 20:06 编辑

Pushlet之消息推送(一)
Pushlet(一种comet 架构的实现)是基于Servlet 机制,数据从server端的Java 对象直接推送(push)到客户端浏览器的(动态)HTML 页面,而无需任何Java applet 或者插件的帮助。是使用比较多的后台向前台推送消息的工具。前台订阅某个感兴趣的事件joinListen,触发后台的Pushlet的servlet,为该请求会话建立session,默认这个sessionID是随机的java.rmi.server.UID。

资源下载
下载push-2.0.4,找到如下的资源放在项目的对应位置即可。
1)、pushlet.jar
2)、ajax-pushlet-client.js

系统配置
• 1、web.xml配置servlet
[XML] 纯文本查看 复制代码
<servlet>
    <servlet-name>pushlet</servlet-name>
    <servlet-class>nl.justobjects.pushlet.servlet.Pushlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>pushlet</servlet-name>
    <url-pattern>/pushlet.srv</url-pattern>
  </servlet-mapping>
当前这里也可以自定义Pushlet类,继承自nl.justobjects.pushlet.servlet.Pushlet.java,然后初始化pushlet,并注入applicationContext
•  2、创建推送消息工具类
[Java] 纯文本查看 复制代码
/**
* 消息推送工具类
* 实现点对点推送和广播推送
**/
public class PushletUtil {
    
    private static String PLATFORM_MESSAGE = "UNI_CAST_MESSAGE";
    
    /**
     * 发送消息至客户端
     * @param sessionId
     * @param msg
     */
    public static void sendMessage(String sessionId, String msg){
        if(StringUtils.isNotBlank(sessionId) && SessionManager.getInstance().hasSession(sessionId)){
            Event event = Event.createDataEvent("message");
            event.setField(PLATFORM_MESSAGE, msg);
            Dispatcher.getInstance().unicast(event, sessionId);
        }
    }
    
    /**
     * 广播至所有在线客户端
     * @param msg
     */
    public static void sendBroadcast(String msg){
        Event event = Event.createDataEvent("message");
        event.setField(PLATFORM_MESSAGE, msg);
        Dispatcher.getInstance().broadcast(event);
    }
}


使用示例
实现一个账号同时只能一个人登录。
•1、实现登录是用户的校验
[Java] 纯文本查看 复制代码
synchronized public String validateUserLoginDate() throws Exception{
        Map session = ActionContext.getContext().getSession();
        Map<String,Object> userMap  =(Map)session.get(ConstSystem.UINFO);
        String userId = ((User)userMap.get("user")).getId();
        String myselfUserIdDate = (String) userMap.get("currentUserId");
        List<String> userAll = new ArrayList<String> (ConstData.loginUserMap.values());
        for(String userIdDate : userAll){
           if(userIdDate.indexOf(userId)>=0){//表示当前用户的
               if(!myselfUserIdDate.equals(userIdDate)){
                  System.out.println("开始执行推送并删除session方法-------------");
                  PushletUtil.sendMessage(userIdDate,new String("当前用户已从其他地方登录".getBytes("UTF-8"),"ISO-8859-1"));
               }
           }
        }
        return null;
    }

•2、jsp设置pushlet接受推送消息
[JavaScript] 纯文本查看 复制代码
PL.userId='${session.uinfo.currentUserId}';  //当前登录用户的userId
p_join_listen("message");
function onData(event) {   
    if(event.get('UNI_CAST_MESSAGE') != undefined ) {
        alert(event.get('UNI_CAST_MESSAGE')); 
        //执行退出操作
        window.location = '${appPath}/login/login_quit.st';
    }
}

•3、登录时剔除另一个登录用户
[Java] 纯文本查看 复制代码
//以下方法为剔除另一个登录账户[/align]setTimeout('myfun()',3000);
function myfun(){
    alert("剔除另一个登录用户")
    $.ajax({
        url:"${appPath}/login/login_validateUserLoginDate.st",
        dataType:"json",
        async:true,
        success:function(data){
        }
    }); 
}





分享至 : QQ空间
收藏

1 个回复

倒序浏览
又学一招
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马