2

我试图.在 Struts 2 的动态 URL 模式中包含点,但它不起作用

我的动态 URL 的 Struts 2 配置如下

<struts>
<constant name="struts.enable.SlashesInActionNames" value="true"/>
<constant name="struts.mapper.alwaysSelectFullNamespace" value="false"/>
<constant name="struts.patternMatcher" value="regex" />
<package name="api" extends="struts-default" namespace="/">
    <action name="api/v1/{sid}/function/{id}/version/{ver}" class="com.test.Main" method="test">
        <param name="sid">{sid}</param>
        <param name="id">{id}</param>
        <param name="ver">{ver}</param>
    </action>
</package>

如果我给触发器一个 URL 中没有任何点的 URL,那么它正在工作

/api/v1/test/function/1234/version/1

但是如果我按如下方式将它与点一起使用,那么它会给出 404

/api/v1/test/function/1234/version/1.1

为什么它不起作用?如何让它发挥作用?

4

1 回答 1

0

URL 中的点.表示文件扩展名分隔符。当您在 URL 中使用数据时,应该对其进行编码。点的编码值为%2E

在动作名称中使用带有参数的数据不是 Struts2 的问题,但是如果没有正确编码,某些字符具有特殊含义。有关 URL 规范的详细说明,请参阅RFC 1738

预订的:

许多 URL 方案为特殊含义保留某些字符:它们在 URL 的方案特定部分中的出现具有
指定的语义。如果对应于八位字节的字符
在方案中被保留,则必须对八位字节进行编码。字符“;”、“/”、“?”、“:”、“@”、“=”和“&”是可以
在方案中为特殊含义保留的字符。方案中不得保留其他字符。


通常,当八位位组由字符表示时和对其进行编码时,URL 具有相同的解释。但是,对于保留字符则不是
这样:对为特定方案保留的字符进行编码
可能会改变 URL 的语义。

因此,只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以
在 URL 中未编码地使用。

另一方面,不需要编码的
字符(包括字母数字)可以在
URL 的特定于方案的部分中编码,只要它们不被用于保留
目的。

于 2017-09-30T17:53:31.320 回答