【问题标题】:Struts 2 dynamic URL patterns with dotStruts 2 带点的动态 URL 模式
【发布时间】:2018-03-10 07:21:02
【问题描述】:

我尝试在 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

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

【问题讨论】:

  • 我自己没有使用它,但RegexPatternMatcher 上的 JavaDoc 说:“正则表达式可以采用 {FIELD_NAME} 或 {FIELD_NAME:REGULAR_EXPRESSION} 的形式。” - 所以你可以试试{ver:\d+(\.\d+)?}
  • 好一个。最后一节中的点很棘手,因为它通常用于表示动作扩展。你可以创建自己的ActionMapper 来处理这个问题,或者在/{ver} 部分之后添加一些额外的东西。
  • 您也可以创建改进请求 - issues.apache.org/jira/projects/WW

标签: java url struts2 action-mapping


【解决方案1】:

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

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

保留:

许多 URL 方案保留某些字符以表示特殊含义: 它们在 URL 的方案特定部分中的外观具有
指定的语义。如果一个八位字节对应的字符是
在方案中保留,必须对八位字节进行编码。那些角色 ”;”, “/”、“?”、“:”、“@”、“=”和“&”是可能的字符
为方案中的特殊含义而保留。其他角色不得 在方案中保留。

通常,当八位字节为 URL 时,URL 具有相同的解释
由一个字符表示以及它何时编码。但是,这不是
保留字符为真:编码为 a 保留的字符
特定的方案可能会改变 URL 的语义。

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

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

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2014-11-09
    • 2015-12-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多