我正在努力将 Spring 4 的新 websocket 功能添加到现有的企业 Spring web 应用程序中。
大多数示例都是基于使用 Spring 的注释配置,更重要的是 Spring Boot。我的应用程序既不使用,也没有时间/兴趣将其转换为这样做。
通过大量研究,我已经解决了配置应用程序与示例略有不同的大多数问题(XML 配置和部署到 Eclipse 中的 tomcat 服务器)。
我现在面临的障碍是 DispatcherServlet 的映射。为了让 websockets 工作,我不得不从看起来像这样的东西移动:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.json</url-pattern>
<url-pattern>*.tpl</url-pattern>
<!-- REST web services location -->
<url-pattern>/api/*</url-pattern>
<url-pattern>/gadget/*</url-pattern>
<url-pattern>/rr/*</url-pattern>
<url-pattern>/public/*</url-pattern>
</servlet-mapping>
看起来像这样的东西:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
我根本找不到任何其他方法来让 DispatcherServlet 接收所有 websocket 通信。不过,这大部分都很好。我将以下内容添加到我的上下文 XML 中以仍然能够提供静态资源:
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/**/favicon.ico" location="/favicon.ico" />
现在对于真正的问题,使用根映射“/”似乎您可以在 web.xml 中提供的欢迎文件列表被完全忽略。我在 web.xml 的底部使用以下列表:
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
我们的应用程序中有几十个 URL 路径依赖于从空 URL 路径加载的未键入的“index.htm”,例如https://somesite.com/member/account/
我如何才能对接收我的 websocket 通信的 DispatcherServlet 进行特定映射,或者仅使用“/”映射让欢迎文件列表再次工作?