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

为什么Java Web应用程序使用.do扩展?它是从哪里来的?,java,servlets,web-applications,Java,Servlets,Web Applications,我一直想知道为什么这么多Java开发人员使用“.do”作为他们的web控制器(MVC)资源的扩展。例如: 它甚至不像我在SpringMVC和Struts项目中看到的那样是特定于框架的。 这个“.do”扩展实践从何而来。为什么这样做而不是没有扩展? 我觉得我错过了关于这个的Java世界备忘录 就个人而言,我不喜欢扩展。通常的做法是将struts servlet映射到web.xml中的*.do,以将URL传递到struts servlet。例如: <!-- Standard Action Se

我一直想知道为什么这么多Java开发人员使用“.do”作为他们的web控制器(MVC)资源的扩展。例如:

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


就个人而言,我不喜欢扩展。

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

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

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/do/logon
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/logon.do
注意:本节中的材料并非特定于支柱。这个 servlet映射的配置是 在Javaservlet中定义 规范。本节介绍 配置 应用程序

有两种常见的解决方法 定义将被删除的URL 由控制器servlet处理-- 前缀匹配与扩展 匹配。适当的映射条目 将对每种方法进行描述 下面

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

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/do/logon
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/logon.do
其中
/myapplication
是上下文 应用程序运行的路径 部署

另一方面,扩展映射, 将请求URI与操作匹配 基于以下事实的servlet 以句号结尾,后跟 定义的字符集。对于 例如,JSP处理servlet是 映射到
*.jsp
模式,以便 调用它来处理每个JSP页面 这是要求的使用
*。执行

扩展(表示“do
something”),映射条目将
像这样:

<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/do/*</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/do/logon
<servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
http://www.mycompany.com/myapplication/logon.do
警告-如果定义更多,框架将无法正常运行 多个
元素 对于控制器servlet

警告如果您使用的是1.1版之后的新模块支持,则 应该知道,只有扩展 支持映射

我认为这一惯例一直保持着(有时甚至在更换Struts1之后,有时只是因为人们对它感到满意)。

只是一个安全提示

这是一个很好的做法,使用一些不寻常的扩展为您的控制器,这样入侵者将需要花费更多的时间来寻找一些信息的网站

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

甚至将扩展名更改为
php
aspx
也可能是个好主意


事实上,这是通过模糊处理实现的安全性,但这并不是良好安全性的反面。在一个已经安全的系统上通过模糊性来分层安全性可能会有所帮助。模糊处理的安全性有其有趣的优点和缺点,当它们都可以在互联网上使用时。

我不知道它有多神奇。它的全部功能就是拥有一个主调度servlet,并可能进行一些URL重写,以避免使用/myservlet/前缀。参见Tuckey URL重写。我想是Struts 1。这么久以前我一定忘了。那些日子对Java Web开发人员来说并不太好。@Adam当时(~2001年),我对Struts1很满意。今天,使用它会让我哭泣。2001年我们很幸运拥有Struts 1!有了Struts 2,我们都可以快乐!为希望从“.do”迁移并具有友好URL的用户提供的友好说明。使用servlet路径而不是扩展ie/do/login,然后使用Tuckey筛选器URL重写来生成/do/login=>/login.True,URL重写(通过mod_重写或Tuckey的筛选器)就可以了。这很愚蠢,这是不可原谅的。这是默默无闻的安全。真的,这是混淆。默默无闻不是良好安全的对立面。拒绝泄露客户根本不需要知道的信息是一种良好的做法。在我的公司,我们删除了所有的Web服务器和应用服务器头,并用一个虚构的字符串替换它。即使是晦涩难懂的网站,漏洞扫描的数量也太多了,你能做的任何让自己成为目标的事情都是积极的。默认情况下,响应头足以找出问题所在。