在Wildfly中,“/”被重写为“/index.html”,绕过RequestMapping(“/”)

时间:2014-12-09 00:18:06

标签: spring-mvc wildfly undertow

我正在将一个Spring MVC应用程序从JBoss 7.1.1迁移到Wildfly 8.1,它需要(鼓励?)我使用新的"undertow" module而不是旧的“web”模块。事情正在顺利进行,除了现在请求“/”,用于调用用@RequestMapping("/")注释的控制器方法,不再达到控制器方法。相反,似乎会立即将此类请求重写(未重定向)为“/index.html”。由于我没有(并且从未需要)这样的文件,所有对“/”的请求现在都会产生404错误。

有趣的是,所有其他 @RequestMapping - 带注释的控制器方法继续正常运行。

以下是我的standalone.xml文件中的相关摘要。

<subsystem xmlns="urn:jboss:domain:undertow:1.1">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" max-post-size="4194304"/>
        <host name="default-host" alias="localhost">
        </host>
    </server>
    <servlet-container name="default">
        <jsp-config development="true"/>
    </servlet-container>
</subsystem>

我怀疑当Wildfly的underow模块的subsystem定义没有明确声明handler时,Wildfly默认为file处理程序,它可能负责URL重写 - - 但我不确定这一点。

Undertow项目中的

Documentation about handlers,Wildfly的底层模块所基于的,表示支持“重定向”处理程序。我已经考虑过使用它来解决意外的“/”重写,但我不清楚Wildfly的下载模块是否支持这个,如果是的话,如何在standalone.xml中配置它。然而,即使我能够,我认为它会感觉像是一个黑客,而我更愿意找到问题的根源(没有任何双关语)。

有许多S.O.描述令人失望的RequestMapping("/")行为的问题,以及建议使用其他路径(例如"""/index"等)的许多答案,但不要忘记:现有(未更改的)代码仅适用在JBoss 7.1.1中很好。 (此外,这些问题都没有提到Wildfly,这可能是这个问题的关键考虑因素。)尽管如此,我还是试验了各种各样的建议而无处可去。看起来URL似乎在它到达调度程序servlet之前被重写。

总而言之,我的问题是:

  

如何在Wildfly 8.1中运行带有RequestMapping("/")的Spring MVC应用程序,就像在JBoss 7.1.1中一样?

1 个答案:

答案 0 :(得分:2)

在Wildfly中,如果您的web.xml没有<welcome-file-list>元素,那么就会为您提供一个元素,就好像您已经这样配置了一样:

 <welcome-file-list>
      <welcome-file>index.html</welcome-file>
      <welcome-file>index.htm</welcome-file>
      <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

使用此默认配置,当Wildfly收到“/”请求时,路径会自动重写为index.html。然后,此路径将与使用RequestMapping("/")注释的控制器方法不匹配。

JBoss 7显然表现不同,可能只是在找不到匹配的servlet后才引用欢迎文件列表。

无论原因是什么,您可以通过显式定义自己的欢迎文件列表并将最新<welcome-file>元素包含在空的欢迎文件中来解决新行为:

 <welcome-file></welcome-file>

这允许Wildfly将“/”重写为“/”,从而允许servlet调度程序处理“/”请求(前提是url-pattern 1}}设置为/)。然后,servlet调度程序将调用用RequestMapping("/")注释的控制器方法。