dwr推送spring实现

来源:互联网 发布:it外包服务介绍 编辑:程序博客网 时间:2024/06/10 07:33

概述

最近项目需要一个主动推送的功能,果断百度、google发现网上主要有两种实现方式:

一种是使用HTML5的webSockect,这个需要Tomcat7以上才支持,而且需要客户端的IE浏览器都支持HTML5。所以被我们果断的放弃的了。

另一种是使用dwr实现,dwr是一个JS与服务端Java类交互的Ajax框架。可以做到后台调用Java类方法的同时前台JS方法执行,前台JS方法执行的同时后台Java类的对应方法被执行。

最后使用了DWR来实现后台向前台的数据推送。

基本实现思路:

既然涉及到推送,那么我们肯定要明确推送的发起点以及推送的目标点(每个用户都要有明确ID),并且保证当用户在不同页面跳转时,保证数据都能够推送到前台(会话状态)。在我们的系统中,主要发起点是用户A在前台点击某些操作触发的,推送的目标点是用户B。

Dwr推送的基本思想是将一个后台的Java类映射为一个前台的同名JS类,同时通过JS维持一个长连接,与每个页面产生一个scriptsession,该session保证了长连接的同时也保证了每个链接会话的不同状态。当前台调用java对应的JS类中的某个方法时,dwr调用后台的java类中的同名方法,后台java类的某个方法被调用的时候,前台的对应JS对象的方法也会被调用,也就实现了向前台推送

实现方式:

1,引入DWR包

2,在web.xml文件中配置:

查看文本打印
  1.   
  2.         class 
  3. org.directwebremoting.servlet.DwrListener  
  4.     class 
  5.   
  6.   
  7. dwr-invoker  
  8.     class 
  9. org.directwebremoting.servlet.DwrServlet  
  10.     class 
  11.           
  12. crossDomainSessionSecurity  
  13.                false  
  14.           
  15.           
  16.           allowScriptTagRemoting  
  17.           true  
  18.           
  19.           
  20.           classes  
  21.          java.lang.Object  
  22.           
  23.           
  24.            activeReverseAjaxEnabled  
  25.             true  
  26.           
  27.           
  28.            initApplicationScopeCreatorsAtStartup  
  29.            true  
  30.           
  31.           
  32.             maxWaitAfterWrite  
  33.             3000  
  34.           
  35.           
  36.             logLevel  
  37.             WARN  
  38.           
  39.           
  40.             debug  
  41.             true  
  42.           
  43.   
  44.   
  45. dwr-invoker  
  46.     /dwr  
  47. public class PushUtil  
  48.       
  49.       
  50.     public void onPageLoad(String userId)  
  51.         //ScriptSession,DWR中提供的脚本会话对象,这个会话是储存在本地线程中的  
  52.         ScriptSession scriptSession WebContextFactory.get().getScriptSession();  
  53.         //给每个脚本会话赋值一个属性,一般作为脚本会话的区别属性  
  54.         scriptSession.setAttribute("userId"userId);  
  55.         //初始化信息  
  56.         initInfo();  
  57.      
  58.   
  59.     //初始化方法  
  60.     private void initInfo()  
  61.         //得到当前服务端的dwr容器  
  62.         Container container ServerContextFactory.get().getContainer();  
  63.         //从dwr容器中得到脚本会话管理类  
  64.         ScriptSessionManager manager container.getBean(ScriptSessionManager.class);  
  65.         //从脚本会话管理类中得到目前所有的脚本会话对象  
  66.         Collection sessions manager.getAllScriptSessions();  
  67.         //得到当前访问用户的HttpSession  
  68.         HttpSession httpSession WebContextFactory.get().getSession();  
  69.         //判断当前Http会话中是否已经有scriptSessionId属性  
  70.         //如果有,则说明该HttpSession已经绑定了一个ScriptSession对象  
  71.         //如果没有,则说明该HttpSession还没有绑定ScriptSession  
  72.         if(httpSession.getAttribute("scriptSessionId")!=null){  
  73.             //得到当前HttpSession中存放的scriptSessionId属性  
  74.             int id (Integer)httpSession.getAttribute("scriptSessionId");  
  75.             //遍历所有的ScirptSession对象,尝试将所有ScirptSession的id不是HttpSession中存放的scriptSessionId  
  76.             //的ScriptSession对象废止,注意:这里是废止不是立刻删除  
  77.             for(ScriptSession session:sessions){  
  78.                 if(session.hashCode()!=id){  
  79.                     session.invalidate();  
  80.                  
  81.              
  82.          
  83. //      System.out.println("after invalidate sessionId:"+httpSession.getId()+",scriptSessionCount:"+manager.getScriptSessionsByHttpSessionId(httpSession.getId()).size());  
  84.         //得到会话监听对象  
  85.         ScriptSessionListener listener PushListener.getInstance();  
  86.         //将监听对象添加到ScriptSessionManager管理类上  
  87.         manager.addScriptSessionListener(listener);  
  88.      
  89.   
  90.     //这个方法用来推送,也就是当调用这个方法的时候,前台的JS对应函数就会被触发  
  91.     public static void sendMessageAuto(String userid,String message)  
  92.         //由于我们的推送是有目标的,所以需要目标ID以及要推送信息  
  93.         Browser.withAllSessionsFiltered(new PushFilter(userid),new PushRunable(message));  
  94.      
  95.       
  96.  

  • PushListener类
查看文本打印
  1.   
  2. public class PushListener implements ScriptSessionListener{  
  3.   
  4.     private static PushListener listener;  
  5.       
  6.     private PushListener()  
  7.   
  8.      
  9.       
  10.     public static synchronized PushListener getInstance(){  
  11.         if(listener==null){  
  12.             listener new PushListener();  
  13.          
  14.         return listener;  
  15.      
  16.       
  17.       
  18.     public void sessionCreated(ScriptSessionEvent ev)  
  19.         //得到当前的HttpSession类  
  20.         HttpSession session WebContextFactory.get().getSession();  
  21.         //当前登录用户的用户ID  
  22.         String userId ((Users) session.getAttribute("users")).getUserId() "" 
  23.         //向新创建的ScriptSession中添加属性userId,来标识该ScriptSession对应的用户  
  24.         ev.getSession().setAttribute("userId"userId);  
  25.         //向HttpSession中设置新生成的ScriptSession对象的ID  
  26.         session.setAttribute("scriptSessionId"ev.getSession().hashCode());  
  27.      
  28.       
  29.       
  30.     public void sessionDestroyed(ScriptSessionEvent ev)  
  31.         //尝试废止该ScriptSession对象  
  32.         ev.getSession().invalidate();  
  33.      
  34.   
  35.  

  • PushFilter类
查看文本打印
  1.   
  2. public class PushFilter implements ScriptSessionFilter  
  3.   
  4.     private static PushFilter filter;  
  5.   
  6.     private String userId;  
  7.       
  8.     public PushFilter()  
  9.   
  10.      
  11.       
  12.     public PushFilter(String id){  
  13.         this.userId id;  
  14.      
  15.       
  16.       
  17.     @Override  
  18.     public boolean match(ScriptSession session)  
  19.         //根据脚本中的userId属性来判断是否是要推送的目标脚本会话  
  20.         if (session.getAttribute("userId"== null){  
  21.             return false 
  22.         }else 
  23.             return (session.getAttribute("userId")).equals(userId);  
  24.          
  25.      
  26.   
  27.  

查看文本打印
  1. PushRunnable  
  2. public class PushRunable implements Runnable  
  3.       
  4.     private String message;  
  5.       
  6.     private ScriptBuffer script new ScriptBuffer();  
  7.       
  8.     public PushRunable(){  
  9.           
  10.      
  11.       
  12.     public PushRunable(String msg){  
  13.         this.message msg;  
  14.      
  15.       
  16.     
  17.       
  18.     @Override  
  19.     public void run()  
  20.         //要推送到的前台目标的JS方法以及该方法的参数  
  21.         script.appendCall("showMessage"message);  
  22.         //这里得到的ScriptSession的集合是通过PushFilter过滤过的  
  23.         Collection sessions Browser.getTargetSessions();  
  24.         for (ScriptSession scriptSession sessions)  
  25. //          System.out.println(scriptSession.getAttribute("userId"));  
  26.             scriptSession.addScript(script);  
  27.          
  28.      
  29. }
0 0
原创粉丝点击