【问题标题】:Spring 4 DispatcherServlet mapping with websocketsSpring 4 DispatcherServlet 与 websockets 的映射
【发布时间】:2015-11-03 09:07:38
【问题描述】:

我正在努力将 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 进行特定映射,或者仅使用“/”映射让欢迎文件列表再次工作?

【问题讨论】:

    标签: websocket web.xml spring-4 welcome-file


    【解决方案1】:

    我找到了一个似乎运作良好的解决方案。我认为我的旧 servlet 映射和新的“/”映射是互斥的,但事实并非如此。我只是将“/”映射添加到我现有的映射中,现在 DispatcherServlet 似乎可以为 JSP、JSON 和 websocket 请求提供服务,包括欢迎文件 URL 路径。

    【讨论】:

      【解决方案2】:

      您可以为此注册一个 viewController:

      @Configuration
      public class YourWebConfig extends WebMvcConfigurerAdapter {
      
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
          registry.addViewController("/").setViewName("forward:/index.html");
        }
      }
      

      【讨论】:

      • 这是一个新颖的想法,适用于根 URL,但我还必须为依赖欢迎文件的其他几十个 URL 路径添加类似的映射。例如,somesite.com/member/account 还需要
      猜你喜欢
      • 2013-02-08
      • 2014-10-27
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2010-10-31
      • 1970-01-01
      • 2015-01-18
      相关资源
      最近更新 更多