现如今有个需求,基于 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 即可。
经过实践,是可行的,且用起来很顺手,暂未发现其余问题。
应用案例效果图