Tomcat在URL中添加[/],Struts无法获取正确的动作名称?

问题描述 投票:1回答:1

我有这个项目在Jetty工作正常,最近根据要求,我在Tomcat上测试它,但我发现了一个问题。

我们正在使用Struts2,并且动作映射定义为没有扩展名,例如http://www.somehost.com/projectname/home

当我将所有内容部署到Tomcat并访问上面的url时,我收到此错误:

"There is no Action mapped for namespace [/] and action name [home/]"

很明显Tomcat在网址上添加了额外的/,所以struts认为动作名称是home/而不是home

如果我将动作配置从home更改为home/,它可以正常工作。但我不想用额外的/改变每个动作映射,应该有更好的解决方案,任何人都可以帮助我吗?

这是我的动作配置:

<action name="home" class="com.hp.bpm.portal.action.EmptyAction">
    <result name="success" type="tiles">
      <param name="location">home.default</param>
      <param name="menuItem">home</param>
    </result>
</action>

它是在/包下配置的,当没有任何变化时,我得到了404,如果我在上面更改为:

<action name="home/" class="com.hp.bpm.portal.action.EmptyAction">
    <result name="success" type="tiles">
      <param name="location">home.default</param>
      <param name="menuItem">home</param>
    </result>
</action>

然后它工作。

java url tomcat struts2 struts
1个回答
1
投票

Tomcat正在添加一个尾部斜杠,因为您请求了一个目录。要将目录与具有相同名称的文件区分开来,Tomcat会添加尾部斜杠。包括Jetty在内的其他Web服务器也毫无疑问地遵守了这条规则。否则他们将如何提供目录浏览和欢迎文件列表。另一方面,Struts的Default Action Mapper解析URL以确定它的Action Mapping。 ActionMapper界面也有不同的实现,可以为您的操作创建映射。默认操作映射器使用最后一个斜杠将命名空间与操作名称分开。还有一些配置,您可以在操作名称中看到斜杠,如果配置设置允许,则在匹配操作名称后确定命名空间。如果将操作重命名为目录名以外的其他名称,则可以轻松解决问题。请注意,convention plugin在处理未知操作时添加了斜杠。

URL末尾的斜杠是一种可以跟随normalize URL的样式。 Struts可以使用尾部斜杠和动作名称""处理映射。您还可以通过查看Trailing slash in URLs - which style is preferred来决定哪种风格更适合您。

© www.soinside.com 2019 - 2024. All rights reserved.