¿Por qué las aplicaciones web de Java usan la extensión .do? ¿De dónde vino?

114

Siempre me he preguntado por qué tantos desarrolladores de Java usan ".do" como extensión para sus recursos de controlador web (MVC). Ejemplo: http://example.com/register.do

Ni siquiera parece ser un marco específico como lo he visto en los proyectos Spring MVC y Struts. ¿De dónde viene esta práctica de extensión ".do"? ¿Por qué se hizo esto en lugar de ninguna extensión? Siento que me perdí el memorando mundial de Java sobre esto.

Personalmente prefiero ninguna extensión.

Adam Gent
fuente
4
Nota amigable para las personas que desean migrar desde ".do" y tienen URL amigables. Use la ruta del servlet en lugar de la extensión ie / do / login y luego use la reescritura de URL del filtro Tuckey para hacer / hacer / login ==> / login.
Adam Gent
Es cierto que la reescritura de URL (ya sea a través de mod_rewrite o el filtro de Tuckey) sería suficiente.
Pascal Thivent
1
es bastante idiota y no hay excusa para eso.
irrefutable

Respuestas:

75

Que yo sepa, esta convención ha sido difundida por Struts1. La guía del usuario lo expresa así:

5.4.2 Configurar la asignación de ActionServlet

Nota: El material de esta sección no es específico de Struts. La configuración de las asignaciones de servlets se define en la Especificación de servlets de Java. Esta sección describe los medios más comunes para configurar una aplicación.

Hay dos enfoques comunes para definir las URL que serán procesadas por el servlet del controlador: coincidencia de prefijo y coincidencia de extensión. A continuación se describirá una entrada de mapeo apropiada para cada enfoque.

La coincidencia de prefijo significa que desea que todas las URL que comienzan (después de la parte de la ruta de contexto) con un valor particular se pasen a este servlet. Tal entrada podría verse así:

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

lo que significa que un URI de solicitud para que coincida con la /logonruta descrita anteriormente podría verse así:

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

donde /myapplicationes la ruta de contexto en la que se implementa su aplicación.

El mapeo de extensiones, por otro lado, hace coincidir los URI de solicitud con el servlet de acción basándose en el hecho de que el URI termina con un punto seguido de un conjunto definido de caracteres. Por ejemplo, el servlet de procesamiento JSP se correlaciona con el *.jsppatrón para que se llame para procesar todas las páginas JSP solicitadas. Para usar la *.do extensión (que implica "hacer algo") , la entrada de mapeo se vería así:

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

y un URI de solicitud para que coincida con la /logonruta descrita anteriormente podría verse así:

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

ADVERTENCIA : el marco no funcionará correctamente si define más de un <servlet-mapping>elemento para el servlet del controlador.

ADVERTENCIA : si está utilizando el soporte del nuevo módulo desde la versión 1.1, debe tener en cuenta que solo se admite el mapeo de extensiones.

Y creo que esta convención se ha mantenido (a veces para no cambiar las URL incluso después de reemplazar Struts1, a veces solo porque la gente estaba contenta con ella).

Pascal Thivent
fuente
2
Supuse que era Struts 1. Hace tanto tiempo que debí haberlo olvidado. Esos fueron los días no tan buenos para Java Web Dev.
Adam Gent
4
@Adam En ese momento (~ 2001), estaba feliz con Struts1. Hoy, usarlo me haría llorar.
Pascal Thivent
5
¡En 2001 tuvimos SUERTE de tener Struts 1!
Thorbjørn Ravn Andersen
2
¡Con Struts 2 todos podemos ser felices!
Alireza Fattahi
9

Era una práctica común asignar su servlet struts a * .do en web.xml para pasar las URL al servlet struts. Por ejemplo:

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

Realmente no hay ninguna razón, excepto una convención, para esto. Si no usa ninguna extensión, necesita hacer algo de magia para manejar imágenes y otro contenido estático de una manera que no los envíe a su sevlet. A menudo, esto se hace en un equilibrador de carga de un servidor web frontal.

Leonm
fuente
2
No sé si es mágico. Todo es tener un servlet de despacho maestro y tal vez hacer una reescritura de URL para evitar tener el prefijo / myservlet /. Consulte Reescritura de URL de Tuckey.
Adam Gent
-2

¡Solo un consejo de seguridad!

Es una buena práctica usar alguna extensión inusual para su controlador, de esta manera los intrusos necesitarán dedicar más tiempo a encontrar información sobre el sitio.

Entonces, si cambia la extensión predeterminada, además de algunas estadísticas en su marco que pueden revelar su mano, su marco MVC puede ser completamente desconocido.

Incluso cambiar la extensión phpao aspxpodría ser una buena idea.

Bueno, de hecho, esto es seguridad por ofuscación, pero esto no es lo opuesto a una buena seguridad. La seguridad en capas por oscuridad sobre un sistema ya seguro podría ayudar. Hay ventajas y desventajas interesantes de la seguridad por ofuscación y cuándo se pueden usar ambas en Internet.

Alireza Fattahi
fuente
5
Eso es seguridad por oscuridad.
TGO
Realmente esto es ofuscación
Brandon G
4
La oscuridad no es lo opuesto a una buena seguridad. Negarse a divulgar información que los clientes no tienen ninguna necesidad de conocer es una buena práctica. En mi empresa, eliminamos todos los encabezados del servidor web y del servidor de aplicaciones y lo reemplazamos con una cadena inventada. La cantidad de análisis de vulnerabilidades que obtienen incluso los sitios oscuros es una locura, cualquier cosa que pueda hacer para ser menos un objetivo es positivo.
XP84
De forma predeterminada, los encabezados de respuesta serían suficientes para averiguar las cosas.
Kannan Ramamoorthy