IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE,sockjs-1.1.1,stomp-1.2搭建基于Tomcat-7.0.68的WebSocket应用

接着上文IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE搭建基于Tomcat-7.0.68的WebSocket应用

上文的最后我们说到, WebSocket是需要定时心跳的,否则会在一段时间后自动断开连接,而更重要的是,不是所有的浏览器都支持 WebSocket,早期的 IE 10之前的版本就是不支持的,而这一部分的设备其实是不算少的,而 sockjs的出现,恰恰好来解决了这个问题。对于不支持 WebSocket的浏览器, sockjs使用了多种方式来兼容这种情况,包括使用长轮询等方式, Spring更是内建支持这种方式。

下面我们看如何在上篇文章的基础上,增加对于 sockjs的支持。

首先是 STOMP的文档官网地址 http://stomp.github.io/
代码的地址为https://github.com/jmesnil/stomp-websocket,项目下面的 lib/stomp.js就是我们想要的文件。也可以本站下载stomp.js.zip

接下来 sockjs的代码地址https://github.com/sockjs/sockjs-client,项目下面的 dist/sockjs-1.1.1.js就是我们想要的文件。也可以本站下载sockjs-1.1.1.js.zip

接下来我们把下载到的文件放到我们工程目录下面的 web-> resources-> javascript目录下面,如下图:

stomp-websockjs-resources

接下来,添加我们需要的 com.fasterxml.jackson.core:jackson-annotations:2.8.1, com.fasterxml.jackson.core:jackson-core:2.8.1, com.fasterxml.jackson.core:jackson-databind:2.8.1这三个 jar包,增加的方式参照上一篇中对于 javax.servlet:javax.servlet-api:3.1.0的操作方法。与上一篇的操作不同的是,这次添加的三个 jar包,都要放到编译完成后的 War包中。最后的结果如下图:
ToolsJacksonMaven

ToolsJacksonMavenWar

下面,我们开始进行代码的操作,我们在上篇文章中的 src-> Tools-> WebSocket中新增两个源代码文件 SockJsController.java, WebJsSocketConfig.java.如下图:

NewJavaSourcesForSockjs

其中的代码如下:
SockJsController.java

WebJsSocketConfig.java

然后修改 WebSocket.jsp

最后,我们修改 web-> WEB-INF-> web.xml,在其中增加

修改后的最终结果如下:

参考链接


 

IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE搭建基于Tomcat-7.0.68的WebSocket应用

先参照 IntelliJ IDEA 2016.1建立Strut2工程并使用Tomcat调试建立新的工程,一步一步操作,包括最后引用 Spring框架部分。

经过上面的操作, Spring-WebSocket的包应该已经被默认引入了,如下图所示:

spring-websocket-release-lib

这就意味着我们已经不需要再进行过多的额外配置了。

接下来,我们在 src-> Tools下面新建一个 WebSocket的目录,里面创建三个 Java文件。如下图:
WebSocketJavaSourceList

每个文件中的代码如下:
SystemWebSocketHandler.java

WebSocketConfig.java

WebSocketHandshakeInterceptor.java

由于我们使用了 Struts2导致我们的网络请求优先被 Struts2的拦截器拦截,而 Struts2又处理不了 websocket请求,结果直接返回了 404错误。因此我们需要替换掉默认的在 web.xml中定义的 Struts2的拦截器,要求 Struts2不处理 websocket请求。
我们在 src-> Tools下面新建一个 Filter的目录,下面创建一个名为 StrutsPrepareAndExecuteFilterEx.java的源代码文件,如下图:

StrutsPrepareAndExecuteFilterEx
具体的代码如下:
StrutsPrepareAndExecuteFilterEx.java

这时候的代码是无法编译通过的,原因是依赖的 javaxJar包不存在。此时,我们需要手工引入 javax.servlet:javax.servlet-api:3.1.0这个 Jar包。如下图:

ToolWebSocketProjectStructure

ToolWebSocketProjectStructureAddJars

ToolWebSocketProjectStructureAddJarsFromMaven

ToolWebSocketProjectStructureAddJarsFromMavenJavaxServerletApi3.1.0

ToolWebSocketProjectStructureAddJarsFromMavenJavaxServerletApi3.1.0Add

ToolWebSocketProjectStructureAddJarsFromMavenJavaxServerletApi3.1.0AddApply

还要注意,刚刚添加进入的 javax.servlet:javax.servlet-api:3.1.0这个 Jar包,我们只在编译期间使用,在运行时候,使用 Tomcat自己实现的那个同名 Jar包。也就是这个包是个 Provided,而不是 Compile关系,具体如下图:

ToolWebSocketProjectStructureKeepOutsideWar

接下来,修改 web.xml指定 Struts2的拦截器为我们定义的拦截器

修改为

经过上面的修改后,依旧是没办法进行网络访问的,原因是 web.xml中的 Spring拦截器并没有拦截 WebSocket的数据请求。

修改为

注意增加的

下一步,配置 Spring的配置文件 web-> WEB-INF-> dispatcher-servlet.xml增加配置信息类的扫描目录包含我们刚刚创建的 src-> Tools-> WebSocket的目录(缺少这一步会导致我们通过注解实现的配置信息类没有被自动加载,导致无法访问),修改后的内容如下:

最后,调用的页面的代码
WebSocket.jsp

最后的客户端显示效果如下图所示:
WebSocketJsp

注意:如此创建的 WebSocket是会在两三分钟后主动断开连接的,原因在于 WebSocket需要周期性的发送心跳报文来维持连接。后续我们会尝试使用s ockjs来实现自动发送心跳的逻辑。

具体的sockjs的接入方法,参考IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE,sockjs-1.1.1,stomp-1.2搭建基于Tomcat-7.0.68的WebSocket应用