【问题标题】:Case-insensitive URLs with JAX-RS使用 JAX-RS 的不区分大小写的 URL
【发布时间】:2011-04-11 16:31:11
【问题描述】:

是否有任何简单的方法可以在 JAX-RS Web 服务中提供不区分大小写的 URL?这样做的目标是生成一个“宽松接受器”的 Web 服务。1

我想可以使用.to[Lower|Upper]Case()s 所有传入 URL 的过滤器来做到这一点。不幸的是,这种实现需要程序员遵守纪律/一致性,以确保应用程序中所有硬编码的 URL 字符串都是严格的 [小写|大写]。
另外,我还不知道 JAX-RS 类似于 servlet 过滤器。

如果重要的话,我将使用 Jersey 作为我的 JAX-RS 实现。


1如,“对你所接受的要宽容,对你所生产的东西要严格”(不记得出处)

【问题讨论】:

  • 您可以将 servlet 过滤器放在 JAX-RS 引擎前面(或者您可以使用 CXF;这就是我通过 Spring Security 的挂钩处理我的安全性的方式)。
  • Postel 定律en.wikipedia.org/wiki/Robustness_principle 但是,服务器应该使用超媒体提供客户端要遵循的 URL,因此“严格的生产内容”应该适用于此。 HTTP 规范 RFC 2616 规定,除了方案和主机之外,http URL 应该区分大小写。
  • @Darrel:谢谢你的链接,你说得很好。我去看看楼上的人怎么说。

标签: java rest jersey jax-rs


【解决方案1】:

答案是否定的,因为根据RFC 3986 的 URI 基本上是区分大小写的:

6.2.2.1。案例归一化

对于所有 URI,百分比编码中的十六进制数字 三元组(例如,“%3a”与“%3A”)不区分大小写,因此 应该规范化以使用大写字母作为数字 A-F。

当 URI 使用通用语法的组件时,该组件 语法等价规则始终适用;即,该计划和 主机不区分大小写,因此应规范化为 小写。例如,URI 是 相当于http://www.example.com/。其他通用语法 组件被假定为区分大小写,除非特别 方案另有定义(参见第 6.2.3 节)。

如果您仍然想让它们不区分大小写,您可以使用 servlet 过滤器并将其放在 JAX-RS 框架前面。您仍然需要在您的应用程序中保持一致。

如果您考虑从 Jersey 切换到 Apache Wink,您可以使用 Dynamic Resources 来确保所有网址都是小写/大写。因此,将 servlet 过滤器与动态资源相结合可以成为这种情况的完整解决方案。

【讨论】:

  • 答案取决于你对“简单”的定义
【解决方案2】:

我想我找到了符合 JAX-RS 规范的简单解决方案。您可以像这样在@Path 注释正则表达式中使用:

@Path("/{message:[mM][eE][sS][aA][gG][eE]}")

我已经将它与 JBoss RESTeasy 实现一起使用。查看更多there

【讨论】:

  • 不区分大小写的标志适用于 Jersey 2.10 @Path( "/{message : (?i)message}" )
猜你喜欢
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2012-05-25
相关资源
最近更新 更多