2011-10-31 4 views
1

Java Webアプリケーションの開発者として、いつURLリライティングを使用する必要があり、URLリライティングと転送の違いは何ですか?Javaサーブレットのコンテキストでは、URL書き換えと転送の違いは何ですか?

私は他のウェブサイトで検索しましたが、SEOの人々がこの質問に異なって答えるように話している相手に応じて、私は矛盾した情報を取得します。

AFAIKどちらの場合でも、クライアント(ブラウザ)に変更が通知されず、エンドユーザーは、クライアントがサーバーから返されたときに元々要求したのと同じURLを確認します。

この問題は、リダイレクトと転送が全く異なる2つの方法であるforwardメソッドとsendRedirectメソッドが定義されているJava Servlet APIのコンテキストにあります。この質問は、forward(Servlet APIのforwardメソッドで定義されている)とURL書き換えの違いについてです。疑問は、答えがJavaサーブレットのコンテキストにあるべきであることを明確に述べています。最も重要なのは、いつJava Webアプリケーションを開発するという状況において、URL書き換えをいつ使う必要があるかです。

+0

あなたの前提は正しくありません。転送/リダイレクトは3xxをブラウザに戻し、新しいURLに移動することによって行われます。 –

答えて

6

「転送」という用語は、この質問ではあいまいです。 JSP /サーブレットの世界では、リクエストURL(ブラウザのアドレスバーに表示されるような)がサーブレットを効果的に呼び出すようになっています(URLパターンはweb.xmlまたはと一致します)。モデルを準備し、JSPをビューとして使用してモデルを提示します。そのJSPは順番に "転送"によって呼び出されました。これはRequestDispatcher#forward()によって行われます:

request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response); 

これは確かに、ブラウザのアドレスバーにJSPのURLを反映するものではありません。これは完全にサーバー側で行われます。基本的には、サーブレットはJSPを「ロード」し、リクエスト/レスポンスを渡して、HTMLの生成を行うことができます。上記の例のJSPは/WEB-INFフォルダに隠されているため、ブラウザのアドレスバーにフルパスを入力しようとするエンドユーザはアクセスできません。

一般的なウェブ開発の世界では、「転送」という用語は、URLリダイレクトと本質的に同じ「URL転送」から知られているでもです。これは、実際にはブラウザのアドレスバーに変更を引き起こします。これは、正式には「リダイレクト」と呼ばれるJSP /サーブレットの世界にあります(ほとんどの初心者は最初に「転送」と混同します)。これはHttpServletResponse#sendRedirect()によって行われます:

response.sendRedirect("another-servlet-url"); 

基本的には、サーバは、クライアントが指定したLocationに新しいGETリクエストを行う必要がありますLocationヘッダとHTTPの3nn応答によってクライアントに伝えます。上記の効果次のように同じである:それはその仕事をするように指示されているクライアント(Webブラウザー)だとして

response.setStatus(302); 
response.setHeader("Location", "another-servlet-url"); 

は、ブラウザのアドレスバーに戻って反映され、このURLの変更を参照してください。


用語 "URL書き換え" もあいまいです。 JSP /サーブレットの世界では、URLの書き換えはセッションIDをURLに追加する形式であり、Cookieなしのブラウザでもサーバーとのセッションを維持できます。おそらくURLに;jsessionid=somehexvalueという属性があります。これはデフォルトで自動的には行われませんが、ほとんどのサーブレットベースのMVCフレームワークは自動的にそれを行います。これはHttpServletResponse#encodeURL()またはencodeRedirectURL()によって行われます。

String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url) 
// Then use this URL in links in JSP or response.sendRedirect(). 

(順番に-again-があいまいな用語はどれ普段percent encodingと思うだろう「URLエンコーディング」で、このための機能はありませんサーブレットAPIはありません。この)は、JSFの<h:outputLink>として、JSTLの<c:url>及び<c:param>またはサーブレットベースのMVCフレームワークが提供するUIコンポーネントによってJSPに、URLEncoder#encode()または、MVC、技術的に正しいことによって行われる通常で

あります一般的なWeb開発apache HTTPDのmod_rewriteが何をしているとしても、URLの書き換えは、クライアント側のURLの変更を反映することなく、受信URLを具体的なリソースにマッピングすることで知られています。 JSP /サーブレットの世界では、これも可能であり、を使用するFilter実装によって通常行われます。よく知られている実装はthe Tuckey's URLRewriteFilterです。


は、私は、Apache HTTPD/PHPの世界で自分のルーツを持ちながら、私は念のため、JSP /サーブレットを開始したとき、これはまた、長い間私を混同していることを認めています。

2

書き換えは、要求が処理される前にURLを変更することによって、URLを異なるURLのように扱うようにするレイヤーです(しばしばサーブレットの前にあります)。サーブレットは、書き換えられたURLが要求されたかのように、通常1回の要求で応答します。

Forwarding (or redirection)は、some 3xx error codes(クライアントからのリダイレクトが許可されている場合)経由でサーバーから指示されたときにブラウザ(通常は自動的に)によって実行されます。この場合、2つのリクエストが提供されます(必ずしもサーブレットの両方である必要はありません)。最初にエラーコードとリダイレクトするURLで応答し、2つ目はクライアントがリダイレクトした後に適切な要求を処理します。

+3

Forwardingについてのあなたの答えはRedirectに適用され、Forwardには適用されません。 – ace

+1

@ace:私が投稿した記事の最初の文を見てください:* URLリダイレクション、URL転送とも呼ばれる... *彼らは同じ概念です。それが転送の意味ではない場合は、あなたが参照している「転送」の恣意的な定義を明確にする必要があります。 –

+0

Mark、私の答えも読んでいるのかどうか分かりませんが、具体的な質問であなたの混乱を取り除くためにそれを読むことをお勧めします。 JSP /サーブレットと密接に連携したことはありません。 – BalusC

関連する問題