为啥 Java webapps 使用 .do 扩展名?它从哪里来的?

Posted

技术标签:

【中文标题】为啥 Java webapps 使用 .do 扩展名?它从哪里来的?【英文标题】:Why do Java webapps use .do extension? Where did it come from?为什么 Java webapps 使用 .do 扩展名?它从哪里来的? 【发布时间】:2011-04-05 14:01:16 【问题描述】:

我一直想知道为什么这么多 Java 开发人员使用“.do”作为其 Web 控制器 (MVC) 资源的扩展名。示例:http://example.com/register.do

它甚至不像我在 Spring MVC 和 Struts 项目中看到的那样是特定于框架的。 这个“.do”扩展实践从何而来。为什么这样做而不是不扩展? 我觉得我错过了关于这方面的 Java 世界备忘录。

我个人不喜欢扩展。

【问题讨论】:

对希望从“.do”迁移并拥有友好 URL 的人的友好说明。使用 servlet 路径而不是扩展名,即 /do/login,然后使用 Tuckey 过滤器 URL 重写使 /do/login ==> /login。 没错,URL 重写(无论是通过 mod_rewrite 还是 Tuckey 的过滤器)都可以解决问题。 这很愚蠢,没有任何借口。 对于 Struts2 中的 .action:What does .action / .event at an end of a url mean? 【参考方案1】:

据我所知,Struts1 已经传播了这种约定。用户指南是这样写的:

5.4.2 Configure the ActionServlet Mapping

注意:本节中的材料并非特定于 Struts。这 servlet 映射的配置是 在 Java Servlet 中定义 规格。本节介绍 最常见的配置方法 应用。

有两种常见的方法 定义将成为的 URL 由控制器 servlet 处理—— 前缀匹配和扩展 匹配。适当的映射条目 将描述每种方法 下面。

前缀匹配意味着你想要 所有开始的 URL(在上下文之后 路径部分)具有特定值 传递给这个 servlet。这样一个 条目可能如下所示:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>

这意味着一个请求URI 匹配所描述的/logon 路径 之前可能看起来像这样:

http://www.mycompany.com/myapplication/do/logon

/myapplication 是上下文 您的应用程序所在的路径 部署。

另一方面,扩展映射, 将请求 URI 与操作匹配 servlet 基于 URI 以句点结尾,后跟一个 定义的字符集。为了 例如,JSP 处理 servlet 是 映射到*.jsp 模式,这样 它被调用来处理每个 JSP 页面 这是要求的。 使用*.do 扩展名(这意味着“做 something"),映射条目将 看起来像这样:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

和一个匹配的请求 URI /logon 前面描述的路径可能 看起来像这样:

http://www.mycompany.com/myapplication/logon.do

警告 - 如果您定义更多,框架将无法正常运行 不止一个&lt;servlet-mapping&gt; 元素 用于控制器 servlet。

警告 - 如果您从 1.1 版开始使用新的模块支持,您 应该知道,只有扩展 支持映射。

而且我认为这个约定得到了保留(有时to not change URLs 甚至在替换了 Struts1 之后,有时只是因为人们对此感到满意)。

【讨论】:

我还以为是 Struts 1。这么久以前我一定忘记了。对于 Java Web Dev 来说,那些日子并不是那么好。 @Adam 那时(~2001 年),我对 Struts1 很满意。今天,使用它会让我哭泣。 2001 年我们很幸运拥有 Struts 1! 有了 Struts 2,我们都可以快乐起来!【参考方案2】:

通常的做法是将您的 struts servlet 映射到 web.xml 中的 *.do 以将 URL 传递给 struts servlet。例如:

<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

除了惯例之外,真的没有其他理由。如果您不使用扩展程序,您需要做一些魔术来处理图像和其他静态内容,而不会将它们发送到您的 sevlet。这通常在前端 Web 服务器的负载平衡器上完成。

【讨论】:

我不知道它是魔法。它只是拥有一个主调度 servlet,并且可能会进行一些 URL 重写以避免使用 /myservlet/ 前缀。请参阅 Tuckey URL 重写。【参考方案3】:

只是一个安全提示!

最好为您的控制器使用一些不寻常的扩展,这样入侵者将需要花费更多时间来查找有关该站点的一些信息。

因此,如果您更改默认扩展,再加上框架中的一些可能暴露您手的静态变量,您的 MVC 框架可能完全未知。

即使将扩展名更改为 phpaspx 也是个好主意。

这确实是通过混淆实现的安全性,但这并不是良好安全性的对立面。在已经安全的系统之上通过默默无闻地分层安全性可能会有所帮助。混淆以及何时可以在互联网中使用它们在安全性方面有有趣的优点和缺点。

【讨论】:

这就是默默无闻的安全。 真的是混淆了 默默无闻并不是良好安全性的对立面。拒绝透露客户零需要知道的信息是一种很好的做法。在我的公司,我们清除了所有网络服务器和应用程序服务器标头,并将其替换为虚构的字符串。即使是晦涩难懂的网站,漏洞扫描的数量也很疯狂,您可以采取任何措施让自己不再成为目标。 默认情况下,响应标头足以弄清楚事情。

以上是关于为啥 Java webapps 使用 .do 扩展名?它从哪里来的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 REST-ful URL 创建 Spring 3 + Tiles 2 webapp?

java创建一个maven web的项目,为啥只有src文件夹和pom.xml文件??

为啥 Java 的数字类不相互扩展?

为啥在这里使用 do.call ?

为啥在 Lua 中使用 do-end 块?

为啥不能在 Java 中扩展注解?