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

     2023-02-22     267

关键词:

【中文标题】为啥 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 也是个好主意。

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

【讨论】:

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

为啥在这里使用 do.call ?

】为啥在这里使用do.call?【英文标题】:Whyusedo.callhere?为什么在这里使用do.call?【发布时间】:2018-12-1011:06:04【问题描述】:这是ggplot2数据分析优雅图形的示例geom_mean<-function(...,bar.params=list(),errorbar.params=list())params<-list(...... 查看详情

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

】为啥Java的数字类不相互扩展?【英文标题】:Whydon\'tJava\'snumberclassesextendeachother?为什么Java的数字类不相互扩展?【发布时间】:2014-11-1202:15:06【问题描述】:在Java中,为什么内置的数字类不相互扩展?Long不应该扩展Integer扩... 查看详情

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

】为啥在Lua中使用do-end块?【英文标题】:Whyuseado-endblockinLua?为什么在Lua中使用do-end块?【发布时间】:2014-07-1617:16:18【问题描述】:我一直试图为此寻找答案,但未能如愿。我想知道,do-end块实际用于什么?它只是说在我的书... 查看详情

如何使用额外的 MVC Core 2 应用程序扩展 MVC Core 2 webapp

】如何使用额外的MVCCore2应用程序扩展MVCCore2webapp【英文标题】:HowtoextendaMVCCore2webappwithadditionalMVCCore2applications【发布时间】:2018-11-1712:51:59【问题描述】:我们需要能够使用附加的MVCCore2应用程序(模块)扩展现有的MVCCore2应用... 查看详情

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

】为啥不能在Java中扩展注解?【英文标题】:WhyisitnotpossibletoextendannotationsinJava?为什么不能在Java中扩展注解?【发布时间】:2010-12-1002:13:56【问题描述】:我不明白为什么Java注解中没有继承,就像Java类一样。我认为这将非常有... 查看详情

哪种编程语言具有扩展名 .do

...:05:13【问题描述】:只是想知道扩展名为“.do”的网页上使用了哪些编程语言【问题讨论】:@Kobi简单的搜索把我带到了这个页面;)Whatdoes.dowebpagestandsfor的可能重复【参考方案1】:根据FileInfo,文件扩展名是JavaServlets。【讨 查看详情

为啥要使用扩展运算符将变量扩展到自身?

】为啥要使用扩展运算符将变量扩展到自身?【英文标题】:Whywouldyouusethespreadoperatortospreadavariableontoitself?为什么要使用扩展运算符将变量扩展到自身?【发布时间】:2021-12-2300:23:35【问题描述】:在GoogleGettingstartedwithNode.js教程... 查看详情

webapp开发工具用啥?打包方式?

安卓webapp用什么开发?怎么打包成apk?ioswebapp怎么开发?怎么打包?APICloud的可以提供webAPP打包,可以直接选择用腾讯X5内核打包生成APP,并且在WebApp中同样可以使用APICloud所有扩展API。参考技术AAPICloud的可以提供webAPP打包,可以... 查看详情

如何在使用“delims =”作为扩展列表时将搜索目录包含到 FOR-DO 循环中

】如何在使用“delims=”作为扩展列表时将搜索目录包含到FOR-DO循环中【英文标题】:HowtoincludesearchdirectoryintoFOR-DOloopwhileusing"delims="foralistofextensions【发布时间】:2021-09-0216:47:41【问题描述】:在Windows10中,通过批处理,... 查看详情

为啥我不能正确使用扩展类的方法?

】为啥我不能正确使用扩展类的方法?【英文标题】:whycanInotusemethodsofmyextendedclasscorrectly?为什么我不能正确使用扩展类的方法?【发布时间】:2022-01-0305:45:54【问题描述】:我正在做一个使用抽象类的项目。我把Item类弄疯了,... 查看详情

为啥使用扩展语法适用于基元和函数?

】为啥使用扩展语法适用于基元和函数?【英文标题】:WhyDoesUsingtheSpreadSyntaxWorkwithPrimitivesandFunctions?为什么使用扩展语法适用于基元和函数?【发布时间】:2020-12-2308:48:05【问题描述】:在测试一些代码时,我遇到了一些我以... 查看详情

使用静态导入时,为啥不能将扩展方法调用为静态方法?

】使用静态导入时,为啥不能将扩展方法调用为静态方法?【英文标题】:Whycan\'tIcallanextensionmethodasastaticmethodwhenusingstaticimport?使用静态导入时,为什么不能将扩展方法调用为静态方法?【发布时间】:2016-12-2309:59:18【问题描述... 查看详情

为啥 Java 中的每个对象都隐式扩展 java.lang.Object 类?

】为啥Java中的每个对象都隐式扩展java.lang.Object类?【英文标题】:WhydoeseveryobjectinJavaimplicitlyextendjava.lang.Objectclass?为什么Java中的每个对象都隐式扩展java.lang.Object类?【发布时间】:2013-10-0713:01:33【问题描述】:我用Java编程已... 查看详情

为啥不能在对象键之后使用 Javascript 扩展运算符?

】为啥不能在对象键之后使用Javascript扩展运算符?【英文标题】:Whycan\'tJavascriptspreadoperatorbeusedafterobjectkey?为什么不能在对象键之后使用Javascript扩展运算符?【发布时间】:2019-04-1323:40:02【问题描述】:我有以下代码:constarray... 查看详情

为啥 Scala trait 可以扩展一个类?

】为啥Scalatrait可以扩展一个类?【英文标题】:WhycanaScalatraitextendaclass?为什么Scalatrait可以扩展一个类?【发布时间】:2012-10-0300:36:47【问题描述】:我看到Scala中的特征类似于Java中的接口(但Java中的接口扩展了其他接口,它们... 查看详情

为啥在使用扩展语法复制对象后 getter/setter 不再工作?

】为啥在使用扩展语法复制对象后getter/setter不再工作?【英文标题】:Whyaregetter/setternolongerworkingaftercopyinganobjectwiththespreadsyntax?为什么在使用扩展语法复制对象后getter/setter不再工作?【发布时间】:2019-01-1212:16:38【问题描述】... 查看详情

为啥 3.times 需要一个 .each 如果作为参数传递,但直接使用时不需要,如“3.times do xyz end”

】为啥3.times需要一个.each如果作为参数传递,但直接使用时不需要,如“3.timesdoxyzend”【英文标题】:Whydoes3.timesneedsa.eachifpassedasanargument,butnotwhenuseddirectly,asin"3.timesdoxyzend"为什么3.times需要一个.each如果作为参数传递,但... 查看详情

为啥 HTML5 视频不能在 IOS 8 WebApp(webview) 中播放?

】为啥HTML5视频不能在IOS8WebApp(webview)中播放?【英文标题】:WhyHTML5videodoesn\'tplayinIOS8WebApp(webview)?为什么HTML5视频不能在IOS8WebApp(webview)中播放?【发布时间】:2014-11-1607:37:34【问题描述】:在Safari浏览器上播放简单的HTML5视频。... 查看详情