Why do Java webapps use .do extension? Where did it come from?

JavaServletsWeb Applications

Java Problem Overview


I have always wondered why so many Java developers use ".do" as the extension for their web controller (MVC) resources. Example: http://example.com/register.do

It doesn't even seem to be framework specific as I have seen it in Spring MVC and Struts projects. Where did this ".do" extension practice come from. Why was this done instead of no extension? I feel like I missed the Java world memo on this.

Personally I prefer no extension.

Java Solutions


Solution 1 - Java

To my knowledge, this convention has been spread by Struts1. The user guide puts it like this:

> ### 5.4.2 Configure the ActionServlet Mapping > > Note: The material in this section is not specific to Struts. The > configuration of servlet mappings is > defined in the Java Servlet > Specification. This section describes > the most common means of configuring a > application. > > There are two common approaches to > defining the URLs that will be > processed by the controller servlet -- > prefix matching and extension > matching. An appropriate mapping entry > for each approach will be described > below. > > Prefix matching means that you want > all URLs that start (after the context > path part) with a particular value to > be passed to this servlet. Such an > entry might look like this: > > > action > /do/ > > > which means that a request URI to > match the /logon path described > earlier might look like this: > > http://www.mycompany.com/myapplication/do/logon > > where /myapplication is the context > path under which your application is > deployed. > > Extension mapping, on the other hand, > matches request URIs to the action > servlet based on the fact that the URI > ends with a period followed by a > defined set of characters. For > example, the JSP processing servlet is > mapped to the *.jsp pattern so that > it is called to process every JSP page > that is requested. To use the *.do > extension (which implies "do > something"), the mapping entry would > look like this: > > > action > .do > > > and a request URI to match the > /logon path described earlier might > look like this: > > http://www.mycompany.com/myapplication/logon.do > > WARNING - The framework will not operate correctly if you define more > than one <servlet-mapping> element > for the controller servlet. > > WARNING - If you are using the new module support since version 1.1, you > should be aware that only extension > mapping is supported.

And I think this convention has been kept (sometimes to not change URLs even after replacing Struts1, sometimes just because people were happy with it).

Solution 2 - Java

It was common practice to map your struts servlet to *.do in web.xml to pass URLs to the struts servlet. For example:

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

There is really no reason except convention for this. If you use no extension you need to do some magic to handle images and other static content in a way that doesn't send them to your sevlet. Often this gets done at a load balancer of a fronting web server.

Solution 3 - Java

Just a security tip!

It is good practice to use some unusual extension for your controller, in this way the intruders will need to spend more time to find some info about the site.

So if you change the default extension, plus some few statics in your framework which may reveal your hand, your MVC framework can be completely unknown.

Even change extension to php or aspx could be good idea.

Well indeed this is security by obfuscation, but this isn't the opposite of good security. Layering security by obscurity on top of an already secure system might help. There are interesting pros and cons of security by obfuscation and when they can be both used in the internet.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAdam GentView Question on Stackoverflow
Solution 1 - JavaPascal ThiventView Answer on Stackoverflow
Solution 2 - JavaleonmView Answer on Stackoverflow
Solution 3 - JavaAlireza FattahiView Answer on Stackoverflow