鄙人有個需求,基於websocket實現瀏覽器與服務器的通信。 由於之前沒有使用過websocket,在網上大致搜索了一圈,尋找websocket的集成方案。
由於事物繁忙,不能再像以前那樣每個步驟精細化截圖,因此憑着記憶記錄一下:
1.基於spring的方式實現,加入spring-websocket依賴,加註解,配置相應的攔截器和路徑;
2.基於springBoot的方式,本質上還是基於spring;
3.基於J2EE應用服務器,好像從tomcat7開始有提供websocket支持,直接用@WebsocketEnd 可實現,該註解由servlet包提供;
它們有一個特點,那就是基於servlet實現的(第3種方式尚未求證).
然而,由於種種原因,我需要基於struts2實現,也就是基於Filter實現這個過程,百度了良久,發現的方案是: 在struts2的攔截器中使用元字符開闢一個路徑,然後再進行攔截, 嘗試未果! (<constant name="struts.action.excludePattern" value="/ws/.*,ws://.*"></constant>) 參考這裏
最後,採用的spring+註解的方式實現websocket方案。
又由於其他的原因,導致勢必要將 基於 spirngmvc,也就是servelt的方案轉到 struts,也就是Filer去。 因此,經過一番思索加上實踐,終於找到了相應的解決方案這裏記錄一下,以期能夠幫助同僚們解決相應的需求:
首先使用堆棧追蹤,找到websocket這個servlet執行流程:
堆棧如下:
然後,結合springmvc的執行流程進行分析:
經過分析,我們可以將整個模型邏輯從servelt 搬遷到 相應的Filter上,但是面對諸多的配置,如何平滑的遷移是個問題,我是這樣處理的,在mvc這邊執行時打上斷點,查看相應內存中的變量類型,然後手動構造:
原來的代碼長這樣:
經實踐,那些衆多的配置以及 @Configuration 用於與springmvc的相應配置,以及這裏本地參數的初始化。 因此我完全可以手造一個。 我造的代碼如下:
其它的邏輯就直接基於struts即可。
經我實踐,是可行的,且用起來很順手,暫未發現其餘問題。
如有朋友有類似需求,歡迎留言討論。