2011-10-31 20 views
1

隨着Java Web應用程序的開發者,當我需要使用URL重寫,而這也正是URL重寫和代理之間的區別?在Java Servlet的上下文中,URL重寫和轉發有什麼區別?

我搜索其他網站上,我得到這取決於你是誰說話喜歡SEO的人會不同的回答這個問題,在矛盾的信息。

據我所知在這兩種情況下,客戶端(瀏覽器)不告知的變化和最終用戶看到完全相同的URL時,安息從服務器返回客戶端最初請求。

請,這個問題是在該向前的方法和的sendRedirect方法被定義,其中重定向和轉發是完全2個不同的東西的Java Servlet API的情況下。這個問題是關於forward(由Servlet API中的forward方法定義)和URL重寫之間的區別。這個問題清楚地表明答案應該在Java servlet的上下文中。最重要的是什麼時候需要使用URL重寫,同樣在開發Java Web應用程序的上下文中。

+0

你的假設是不正確的。轉發/重定向是通過向瀏覽器返回一個3xx以及一個新的URL來完成的。 –

回答

6

術語「轉發」是在這個問題上含糊不清。在JSP/Servlet世界中,從MVC概念中更多地瞭解到「轉發」,即請求URL(在瀏覽器地址欄中可見)有效地調用作爲控制器的servlet(與其URL模式匹配的web.xml@WebServlet)準備模型並使用JSP作爲視圖來呈現模型。該JSP反過來被「轉發」調用。這是通過RequestDispatcher#forward()完成:

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

這確實不能反映JSP在瀏覽器地址欄中的URL。這完全發生在服務器端。基本上,servlet「加載」JSP並將請求/響應傳遞給它,以便它可以完成生成HTML內容的工作。請注意,上述示例中的JSP隱藏在/WEB-INF文件夾中,這使得最終用戶嘗試在瀏覽器地址欄中輸入完整路徑時無法訪問該文件夾。

在一般的web開發世界中,術語「轉發」是也是,它從URL轉發中知道,它基本上與URL重定向相同。這反過來確實會導致瀏覽器地址欄的更改。這是在JSP/Servlet世界更正式地稱爲「重定向」(儘管大多數初學者最初將其與「轉發」混淆)。這是通過HttpServletResponse#sendRedirect()完成:

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

基本上,服務器通過與Location頭,客戶端應該在給定Location新的GET請求的HTTP響應3NN告訴客戶。以上是實際上是相同的,如下:

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

,因爲它是客戶,誰是被指示做的工作(web瀏覽器),你看到正在反映了這個網址的變化早在瀏覽器地址欄中。


術語 「URL重寫」 是曖昧。在JSP/Servlet世界中,「URL重寫」是將會話ID附加到URL的形式,以便無Cookie瀏覽器仍然可以維持與服務器的會話。您可能會在URL中看到過;jsessionid=somehexvalue屬性。這是默認不會自動完成的,但大多數基於Servlet的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-含糊的字眼隨着「URL編碼」你通常認爲的percent encoding有此設施提供任何Servlet API的。中,通常要由URLEncoder#encode()或通過JSTL的<c:url><c:param>或通過基於servlet的MVC架構提供的任何用戶界面組件,例如完成的,MVC-技術上更正確的,在JSP JSF的<h:outputLink>

在一般web開發(尤其是使用Apache HTTPD/PHP的人),「URL重寫」更多地被稱爲Apache HTTPD的mod_rewrite正在做的事情:將傳入的URL映射到具體的資源,而不反映客戶端的URL更改。在JSP/Servlet世界中,這也是可能的,並且通常通過使用RequestDispatcher#forward()Filter實現完成。衆所周知的實現是the Tuckey's URLRewriteFilter


我承認,這也讓我感到困惑長,當我剛開始用JSP/Servlet的,肯定的,同時具有在執行Apache/PHP的世界我的根。

2

重寫是一個層(通常在你的servlet之前),通過在請求被提供之前修改URL來導致URL被處理爲不同的URL。該servlet通過一個請求進行響應,就好像重寫的URL被請求一樣,通常從未知道發生了重寫。

Forwarding (or redirection)由服務器通過some 3xx error codes(當客戶端允許重定向時)由瀏覽器執行(通常是自動執行)。在這種情況下,將會提供兩個請求(不一定都來自您的servlet);第一個響應的錯誤代碼和URL將重定向到,第二個在客戶端重定向後提供正確的請求。

+3

有關轉發的答案適用於重定向而不轉發。 – ace

+1

@ace:看看我發佈的文章的第一句話:* URL重定向,也稱爲URL轉發... *它們是相同的概念。如果這不是你轉發的意思,你真的需要澄清你所指的「轉發」的任意定義。 –

+0

馬克,我不確定你是否也讀過我的回答,但我建議你閱讀它,以清理你在具體問題上的明顯混淆。您似乎並沒有真正與JSP/Servlet緊密合作過。 – BalusC

相關問題