首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

DWR 3.0 純註解配置實戰:反向 Ajax 實現伺服器主動推送

     編輯:Java 相關知識

DWR 反向 Ajax 核心機制

DWR (Direct Web Remoting) 允許伺服器端 Java 代碼直接呼叫瀏覽器端 JavaScript 函數。關鍵在於建立 ScriptSession 與 HTTP Session 的綁定,透過 ScriptSessionId 實現精準推送。

兩大核心 Service 組件

1. Remote Service - 頁面載入時自動註冊 ScriptSession

@Service("remoteService")
public class RemoteService {
    public void registerSession() {
        ScriptSession scriptSession = WebContextFactory.get().getScriptSession();
        String jsessionId = scriptSession.getHttpSessionId();
        String dwrSessionId = scriptSession.getId();
        // 存入全域快取:jsessionId -> dwrSessionId
        ConstantCacheService.putCacheConstant(PUSH_ID + jsessionId, dwrSessionId);
    }
}

2. 反向推送 Service - 根據 HTTP Session 精準推送

@Service("dwrReverseAjaxService")
public class DwrReverseAjaxService {
    private static final Logger LOGGER = LoggerFactory.getLogger(DwrReverseAjaxService.class);

    public void pushToClient(HttpSession session, String jsFunctionName) {
        String scriptSessionId = ConstantCacheService.getCacheConstant(PUSH_ID + session.getId());
        Browser.withSession(scriptSessionId, () -> {
            ScriptSessions.addFunctionCall(jsFunctionName, "");
        });
    }
}

前端頁面配置

  1. 引入 DWR 引擎與生成的介面 JS:<script src="/dwr/engine.js>、<script src="/dwr/interface/remoteService.js>
  2. 頁面載入時呼叫 remoteService.registerSession() 建立綁定。
  3. 定義可被呼叫的 JS 函數(需在全域作用域):function serverCallback() { ... }

伺服器端觸發推送

@Autowired DwrReverseAjaxService reverseAjax;
public void notifyUser(HttpSession session) {
    reverseAjax.pushToClient(session, "serverCallback");
}

注意事項

  • 目標 JS 函數必須定義在主頁面全域作用域,iframe 內函數無法直接存取。
  • ScriptSession 逾時設定需與 HTTP Session 一致。
  • 集群環境需配置 Session 複製或使用共享快取(如 Redis)儲存映射關係。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved