为什么Java Web应用程序使用.do扩展名?它从哪里来的?


114

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

正如我在Spring MVC和Struts项目中所看到的那样,它甚至似乎并不是特定于框架的。这种“ .do”扩展实践从何而来。为什么这样做而不是不进行扩展?我觉得我想念有关Java世界的备忘录。

我个人不喜欢扩展。


4
想要从“ .do”迁移并具有友好URL的用户的友好注释。使用servlet路径而不是扩展名/ do / login,然后使用Tuckey筛选器URL重写来制作/ do / login ==> / login。
亚当·根特

的确,URL重写(通过mod_rewrite或Tuckey的过滤器)可以解决问题。
Pascal Thivent

1
这是很愚蠢的,没有任何借口。
无可争议的

Answers:


75

据我所知,该约定已被Struts1传播。用户指南如下所示:

5.4.2配置ActionServlet映射

注意: 本节中的材料并不特定于Struts。Servlet映射的配置在Java Servlet规范中定义。本节介绍配置应用程序的最常用方法。

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

前缀匹配意味着您希望将以特定值开头(在上下文路径部分之后)的所有URL传递到此servlet。这样的条目可能看起来像这样:

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

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

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

/myapplication部署应用程序的上下文路径在哪里。

另一方面,扩展映射基于以下事实将请求URI与操作servlet匹配:URI以一个句点结束,后跟一个定义的字符集。例如,将JSP处理servlet映射到该*.jsp模式,以便调用它来处理所请求的每个JSP页面。要使用*.do 扩展名(表示“做某事”),映射条目应如下所示:

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

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

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

警告 -如果<servlet-mapping>为控制器Servlet 定义多个元素,则框架将无法正常运行。

警告 -如果您使用的是自1.1版以来的新模块支持,则应注意仅支持扩展映射。

而且我认为这个约定已经得到遵守(有时即使替换Struts1后也不更改URL,有时只是因为人们对此感到满意)。


2
我以为是Struts1。这么久以前,我一定已经忘记了。那些日子对于Java Web Dev来说不是那么美好。
亚当·根特

4
@Adam那时(〜2001年),我对Struts1感到满意。今天,使用它会让我哭泣。
Pascal Thivent

5
在2001年,我们很幸运拥有Struts 1!
托尔比约恩Ravn的安德森

2
有了Struts 2,我们都可以开心!
Alireza Fattahi

9

通常的做法是将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服务器的负载平衡器上完成的。


2
我不知道这是魔术。它的全部工作是拥有一个主要的分派servlet并可能进行一些URL重写以避免使用/ myservlet /前缀。请参阅Tuckey URL重写。
亚当·根特

-2

只是安全提示!

优良作法是对控制器使用一些不寻常的扩展名,这样入侵者将需要花费更多时间来查找有关该站点的信息。

因此,如果您更改默认扩展名,再加上框架中的一些静态变量(可能会让您感到不舒服),则您的MVC框架可能是完全未知的。

甚至扩展到phpaspx可能是个好主意。

确实,这是通过混淆实现的安全性,但这与良好的安全性并非相反。在已经很安全的系统上通过模糊处理将安全性分层可能会有所帮助。通过混淆以及何时可以在互联网上同时使用它们,有一些有趣的利弊。


5
默默无闻就是安全。
TGO

真的,这是混淆
布兰登摹

4
默默无闻不是良好安全性的对立面。拒绝泄露客户零需要知道的信息是一种好习惯。在我公司,我们清除了所有Web服务器和应用程序服务器标头,并用伪造的字符串替换了它。即使是晦涩的网站也能进行漏洞扫描的数量太少了,您可以做的任何使自己远离目标的事情都是积极的。
XP84

默认情况下,响应标头足以确定问题所在。
Kannan Ramamoorthy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.