由于Java Web应用程序的开发者,当我需要使用URL重写,而这也正是URL重写和代理之间的区别?
我搜索在其他网站上,我得到这取决于你是谁说话喜欢SEO的人会不同的回答这个问题,在矛盾的信息。
据我所知在这两种情况下,客户端(浏览器)不告知的变化和最终用户看到完全相同的URL时,安息从服务器返回客户端最初请求。
请这个问题是在前进的方法和的sendRedirect方法定义在重定向和转发是完全两个不同的东西的Java Servlet API的情况下。 这个问题是关于前之间的差异,URL重写(由Servlet API中的forward方法定义)。 这个问题明确指出,答案应该是在的Java servlet上下文。 做的时候最重要的是我需要使用URL重写,又在开发Java Web应用程序的情况下。
术语“转发”是在这个问题上含糊不清。 在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");
基本上,服务器通过与一个HTTP响应3NN告诉客户端Location
头,客户端应该在赋予了新的GET请求Location
。 以上是有效地相同的,如下所示:
response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
正如它的客户,谁是被指示做的工作(web浏览器),你看到正在反映了这个网址的变化早在浏览器地址栏中。
术语“URL重写” 也是模棱两可。 在JSP / Servlet的世界,“URL重写”是附加的会话ID的URL,这样浏览器cookie的依然可以保持与服务器的会话的形式。 你可能曾经见过;jsessionid=somehexvalue
在URL属性。 这是在默认情况下不会自动完成的,但大多数基于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().
在一般的Web开发领域(特别是与Apache的httpd / PHP的人),“URL重写”更被称为无论apache httpd的的mod_rewrite
是这样做的:传入的URL映射到具体的资源没有反映客户端的URL变化。 在JSP / Servlet的世界,这也是可能的,它通常是由一个做Filter
,它使用执行RequestDispatcher#forward()
。 一个众所周知的实施是在Tuckey的URLRewriteFilter 。
我承认,这也让我感到困惑长,当我刚开始用JSP / Servlet的,肯定的,同时具有在执行Apache / PHP的世界我的根。
是一个重写层(通常你的servlet之前)引起的URL等不同的URL通过供应请求之前修改所述URL来处理。 该servlet通过仿佛被要求重写URL,平时始终不知道重写发生单个请求进行响应。
转发(或重定向)由浏览器(通常是自动地)时经由由服务器执行的指令一些3xx的错误代码 (当重定向由客户端允许)。 在这种情况下,两个请求将被服务(而不是从你的servlet一定两者); 先用一个错误代码和一个URL重定向到响应,并且所述第二服务的适当请求的客户端重定向之后。
文章来源: In the context of Java Servlet what is the difference between URL Rewriting and Forwarding?