我一直想知道为什么这么多Java开发人员使用“ .do”作为其Web控制器(MVC)资源的扩展名。示例:http://example.com/register.do
正如我在Spring MVC和Struts项目中所看到的那样,它甚至似乎并不是特定于框架的。这种“ .do”扩展实践从何而来。为什么这样做而不是不进行扩展?我觉得我想念有关Java世界的备忘录。
我个人不喜欢扩展。
我一直想知道为什么这么多Java开发人员使用“ .do”作为其Web控制器(MVC)资源的扩展名。示例:http://example.com/register.do
正如我在Spring MVC和Struts项目中所看到的那样,它甚至似乎并不是特定于框架的。这种“ .do”扩展实践从何而来。为什么这样做而不是不进行扩展?我觉得我想念有关Java世界的备忘录。
我个人不喜欢扩展。
Answers:
据我所知,该约定已被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,有时只是因为人们对此感到满意)。
通常的做法是将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服务器的负载平衡器上完成的。
只是安全提示!
优良作法是对控制器使用一些不寻常的扩展名,这样入侵者将需要花费更多时间来查找有关该站点的信息。
因此,如果您更改默认扩展名,再加上框架中的一些静态变量(可能会让您感到不舒服),则您的MVC框架可能是完全未知的。
甚至扩展到php
或aspx
可能是个好主意。
确实,这是通过混淆实现的安全性,但这与良好的安全性并非相反。在已经很安全的系统上通过模糊处理将安全性分层可能会有所帮助。通过混淆以及何时可以在互联网上同时使用它们,有一些有趣的利弊。