Java Webアプリケーションが.do拡張子を使用するのはなぜですか?それはどこから来たのか?


114

なぜこれほど多くのJava開発者がWebコントローラー(MVC)リソースの拡張子として「.do」を使用するのか、いつも疑問に思っていました。例:http : //example.com/register.do

Spring MVCおよびStrutsプロジェクトで見たように、それはフレームワーク固有であるようにも見えません。この「.do」拡張子の練習はどこから来たのですか。なぜこれが拡張子なしではなく行われたのですか?これに関するJavaの世界メモを見逃したような気がします。

個人的に私は延長を好まない。


4
「.do」からの移行を希望し、フレンドリーなURLを持っている人のためのフレンドリーなメモ。拡張子の代わりにサーブレットパスを使用します。つまり、/ do / login、次にTuckey Filter URLの書き換えを使用して、/ do / login ==> / loginを作成します。
Adam Gent、

確かに、URLの書き換え(mod_rewriteまたはTuckeyのフィルターによる)でうまくいくでしょう。
Pascal Thivent、2010

1
それはかなりばかげているし、そのための言い訳はありません。
評判の悪い2010

回答:


75

私の知る限りでは、この慣習はStruts1によって広められました。ユーザーガイドは次のように書いています:

5.4.2 ActionServletマッピングの構成

注: このセクションの内容はStrutsに固有のものではありません。サーブレットマッピングの構成は、Javaサーブレット仕様で定義されています。このセクションでは、アプリケーションを構成する最も一般的な方法について説明します。

コントローラーサーブレットによって処理されるURLを定義するには、プレフィックスマッチングと拡張子マッチングの2つの一般的なアプローチがあります。各アプローチの適切なマッピングエントリについては、以下で説明します。

プレフィックス一致とは、特定の値で始まる(コンテキストパス部分の後に続く)すべてのURLをこのサーブレットに渡すことを意味します。このようなエントリは次のようになります。

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

つまり、/logon前述のパスと一致するリクエストURIは次のようになります。

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

どこ/myapplicationアプリケーションがデプロイされるの下にコンテキストパスです。

一方、拡張マッピングは、URIがピリオドで終わり、その後に定義された文字セットが続くという事実に基づいて、リクエストURIをアクションサーブレットと照合します。たとえば、JSP処理サーブレットは*.jspパターンにマップされ、リクエストされたすべてのJSPページを処理するために呼び出されます。 拡張機能(「何かを行う」ことを意味します)を使用するには*.do、マッピングエントリは次のようになります。

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

/logon前述のパスと一致するリクエストURIは次の ようになります。

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

警告 - <servlet-mapping>コントローラサーブレットに複数の要素を定義すると、フレームワークは正しく動作しません。

警告 -バージョン1.1以降の新しいモジュールサポートを使用している場合は、拡張マッピングのみがサポートされていることに注意してください。

そして、この慣習は守られていると思います(Struts1を置き換えた後でもURLを変更しないこともあります)。


2
Struts 1だと思いました。そんな昔、私は忘れていたに違いありません。それらはJava Web Devにとってそれほど良い日ではありませんでした。
Adam Gent、

4
@Adam当時(〜2001)、Struts1には満足していました。今日、それを使うと私は泣くでしょう。
Pascal Thivent、2010

5
2001年、私たちはStruts 1を手に入れました。
するThorbjörnRavnアンデルセン

2
Struts 2があれば、みんな幸せになれます!
Alireza Fattahi

9

StrutsサーブレットにURLを渡すために、strutsサーブレットをweb.xmlの* .doにマップするのが一般的な方法でした。例えば:

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

慣習以外に理由はありません。拡張機能を使用しない場合、画像やその他の静的コンテンツをsevletに送信しない方法で処理するために、何らかの魔法をかける必要があります。多くの場合、これはフロントWebサーバーのロードバランサーで行われます。


2
私はそれが魔法であることを知りません。マスターディスパッチサーブレットがあり、おそらく/ myservlet /プレフィックスが付かないようにURLの書き換えを行っているだけです。Tuckey URLの書き換えをご覧ください。
Adam Gent、

-2

セキュリティのヒントだけです!

コントローラーに通常とは異なる拡張機能を使用することをお勧めします。このようにして、侵入者はサイトに関する情報を見つけるためにより多くの時間を費やす必要があります。

したがって、デフォルトの拡張機能と、フレームワークのいくつかの静的要素を変更すると、MVCフレームワークが完全に不明になる可能性があります。

でもに拡張子を変更しphpたりaspx、良いアイデアかもしれません。

確かに、これは難読化によるセキュリティですが、これは優れたセキュリティの反対ではありません。すでに安全なシステムの上に、あいまいなセキュリティを重ねることが役立つかもしれません。難読化によるセキュリティの興味深い長所と短所があり、いつインターネットで使用できるかについて説明します。


5
それは無名によるセキュリティです。
TGO 2016年

本当にこれは難読化です
ブランドンG

4
あいまいさは、優れたセキュリティの反対ではありません。クライアントが知る必要のない情報を漏らすことを拒否することは良い習慣です。私の会社では、すべてのWebサーバーとアプリサーバーのヘッダーを削除し、それを架空の文字列に置き換えました。あいまいなサイトが取得する脆弱性スキャンの量は骨の折れるものであり、自分をターゲットから外すためにあなたができることは何でも良いことです。
XP84 2017

デフォルトでは、応答ヘッダーで十分に理解できます。
Kannan Ramamoorthy 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.