Dlaczego aplikacje internetowe Java używają rozszerzenia .do? Skąd to się wzieło?

114

Zawsze zastanawiałem się, dlaczego tak wielu programistów Java używa „.do” jako rozszerzenia swoich zasobów kontrolera sieci (MVC). Przykład: http://example.com/register.do

Wydaje się, że nie jest to nawet specyficzne dla frameworka, ponieważ widziałem to w projektach Spring MVC i Struts. Skąd wzięła się praktyka rozszerzenia „.do”. Dlaczego zrobiono to zamiast bez rozszerzenia? Wydaje mi się, że przegapiłem w tej sprawie notatkę o Javie.

Osobiście wolę brak przedłużenia.

Adam Gent
źródło
4
Przyjazna uwaga dla osób, które chcą migrować z „.do” i mają przyjazne adresy URL. Użyj ścieżki serwletu zamiast rozszerzenia, tj. / Do / login, a następnie użyj przepisywania adresu URL filtru Tuckey, aby utworzyć / do / login ==> / login.
Adam Gent
To prawda, przepisanie adresu URL (czy to przez mod_rewrite, czy filtr Tuckeya) załatwi sprawę.
Pascal Thivent
1
to dość idiotyczne i nie ma na to usprawiedliwienia.
niezaprzeczalny

Odpowiedzi:

75

O ile mi wiadomo, ta konwencja została rozpowszechniona przez Struts1. Podręcznik użytkownika przedstawia to w następujący sposób:

5.4.2 Skonfiguruj mapowanie ActionServlet

Uwaga: materiał w tej sekcji nie dotyczy wyłącznie Struts. Konfiguracja odwzorowań serwletów jest zdefiniowana w specyfikacji Java Servlet Specification. W tej sekcji opisano najczęstsze sposoby konfigurowania aplikacji.

Istnieją dwa typowe podejścia do definiowania adresów URL, które będą przetwarzane przez serwlet kontrolera - dopasowywanie prefiksów i dopasowywanie rozszerzeń. Odpowiedni wpis mapowania dla każdego podejścia zostanie opisany poniżej.

Dopasowywanie prefiksów oznacza, że ​​chcesz, aby wszystkie adresy URL rozpoczynające się (po części ścieżki kontekstu) określoną wartością były przekazywane do tego serwletu. Taki wpis może wyglądać tak:

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

co oznacza, że ​​identyfikator URI żądania pasujący do /logonścieżki opisanej wcześniej może wyglądać następująco:

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

gdzie /myapplicationjest ścieżką kontekstu, w której aplikacja jest wdrażana.

Z drugiej strony, mapowanie rozszerzeń dopasowuje identyfikatory URI żądań do serwletu akcji na podstawie faktu, że identyfikator URI kończy się kropką, po której następuje zdefiniowany zestaw znaków. Na przykład serwlet przetwarzania JSP jest odwzorowywany na *.jspwzorzec, tak że jest wywoływany w celu przetworzenia każdej żądanej strony JSP. Aby użyć *.do rozszerzenia (co oznacza „zrób coś”) , wpis mapowania wyglądałby następująco:

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

a identyfikator URI żądania pasujący do /logonścieżki opisanej wcześniej może wyglądać następująco:

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

OSTRZEŻENIE - struktura nie będzie działać poprawnie, jeśli zdefiniujesz więcej niż jeden <servlet-mapping>element dla serwletu kontrolera.

OSTRZEŻENIE - Jeśli używasz nowej obsługi modułów od wersji 1.1, powinieneś mieć świadomość, że obsługiwane jest tylko mapowanie rozszerzeń.

Myślę, że ta konwencja została zachowana (czasami po to, aby nie zmieniać adresów URL nawet po zastąpieniu Struts1, czasami tylko dlatego, że ludzie byli z tego zadowoleni).

Pascal Thivent
źródło
2
Pomyślałem, że to Struts 1. Taki dawno temu chyba zapomniałem. To były niezbyt dobre dni dla Java Web Dev.
Adam Gent,
4
@Adam W tamtym czasie (~ 2001) byłem zadowolony ze Struts1. Dzisiaj używanie go doprowadziłoby mnie do płaczu.
Pascal Thivent
5
W 2001 roku mieliśmy SZCZĘŚCIE, że mieliśmy Struts 1!
Thorbjørn Ravn Andersen
2
Dzięki Struts 2 wszyscy możemy być szczęśliwi!
Alireza Fattahi
9

Powszechną praktyką było mapowanie serwletu struts do * .do w pliku web.xml w celu przekazywania adresów URL do serwletu struts. Na przykład:

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

Tak naprawdę nie ma ku temu powodu poza konwencją. Jeśli nie używasz żadnego rozszerzenia, musisz zrobić trochę magii, aby obsłużyć obrazy i inną statyczną zawartość w sposób, który nie wysyła ich do twojego sevletu. Często odbywa się to w module równoważenia obciążenia frontowego serwera WWW.

leonm
źródło
2
Nie wiem, czy to magia. Wszystko to polega na posiadaniu głównego serwletu rozsyłającego i być może przepisaniu adresu URL, aby uniknąć posiadania przedrostka / myservlet /. Zobacz przepisywanie adresów URL Tuckey.
Adam Gent,
-2

Tylko wskazówka dotycząca bezpieczeństwa!

Dobrą praktyką jest użycie nietypowego rozszerzenia kontrolera, w ten sposób intruzi będą musieli spędzić więcej czasu, aby znaleźć informacje o witrynie.

Więc jeśli zmienisz domyślne rozszerzenie, plus kilka statystyk w twoim frameworku, które mogą ujawnić twoją rękę, twój framework MVC może być całkowicie nieznany.

Nawet zmień rozszerzenie na phplub aspxmoże być dobrym pomysłem.

Cóż, rzeczywiście jest to ochrona przez zaciemnianie, ale nie jest to przeciwieństwo dobrej ochrony. Pomocne może być nałożenie zabezpieczeń na zaciemnienie na już zabezpieczonym systemie. Istnieją ciekawe zalety i wady bezpieczeństwa przez zaciemnianie i kiedy można ich używać w Internecie.

Alireza Fattahi
źródło
5
To bezpieczeństwo przez zapomnienie.
TGO
Naprawdę to jest zaciemnianie
Brandon G
4
Niewidzialność nie jest przeciwieństwem dobrego bezpieczeństwa. Odmowa ujawnienia informacji, że klienci nie muszą ich znać, jest dobrą praktyką. W mojej firmie usunęliśmy wszystkie nagłówki serwera WWW i serwera aplikacji i zastąpiliśmy je utworzonym ciągiem. Liczba skanowań luk w zabezpieczeniach, które otrzymują nawet nieznane witryny, jest niesamowita, wszystko, co możesz zrobić, aby zmniejszyć się jako cel, jest pozytywne.
XP84
Domyślnie nagłówki odpowiedzi wystarczyłyby, aby dowiedzieć się, co jest.
Kannan Ramamoorthy