2011-10-31 21 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

相关问题