在Javaservlet的上下文中,URL重写和转发之间有什么区别?

在Javaservlet的上下文中,URL重写和转发之间有什么区别?,java,http,servlets,Java,Http,Servlets,作为Java web应用程序的开发人员,我什么时候需要使用URL重写,URL重写和转发有什么区别 我在其他网站上搜索过,我得到了矛盾的信息,这取决于你在和谁说话,就像搜索引擎优化一样,人们会以不同的方式回答这个问题 AFAIK在这两种情况下,客户端浏览器都不会被通知更改,最终用户看到的URL与从服务器返回REST时客户端最初请求的URL完全相同 请注意,这个问题是在JavaServletAPI的上下文中提出的,其中定义了转发方法和sendRedirect方法,其中重定向和转发是完全不同的两件事。

作为Java web应用程序的开发人员,我什么时候需要使用URL重写,URL重写和转发有什么区别

我在其他网站上搜索过,我得到了矛盾的信息,这取决于你在和谁说话,就像搜索引擎优化一样,人们会以不同的方式回答这个问题

AFAIK在这两种情况下,客户端浏览器都不会被通知更改,最终用户看到的URL与从服务器返回REST时客户端最初请求的URL完全相同


请注意,这个问题是在JavaServletAPI的上下文中提出的,其中定义了转发方法和sendRedirect方法,其中重定向和转发是完全不同的两件事。这个问题是关于ServletAPI中forward方法定义的forward和URL重写之间的区别。这个问题清楚地表明答案应该在Javaservlet的上下文中。最重要的是,我什么时候需要使用URL重写,同样是在开发JavaWeb应用程序的上下文中

重写通常是在servlet之前的一个层,它通过在服务请求之前修改URL,使URL像其他URL一样被处理。servlet通过单个请求进行响应,就好像请求了重写的URL一样,通常不知道重写发生了


当客户端允许重定向时,通常在服务器通过发出指示时由浏览器自动执行。在这种情况下,两个请求不一定都来自servlet;第一个用错误代码和要重定向到的URL进行响应,第二个在客户端重定向后提供正确的请求。

重写通常是在servlet之前的一个层,通过在提供请求之前修改URL,使URL像其他URL一样被处理。servlet通过单个请求进行响应,就好像请求了重写的URL一样,通常不知道重写发生了


当客户端允许重定向时,通常在服务器通过发出指示时由浏览器自动执行。在这种情况下,两个请求不一定都来自servlet;第一个用错误代码和要重定向到的URL进行响应,第二个在客户端重定向后提供正确的请求。

在这个问题中,术语“转发”是不明确的。在JSP/Servlet世界中,转发更多地是从MVC概念中了解的,即浏览器地址栏中可见的请求URL有效地调用Servlet,并与web.xml中的URL模式匹配,或者充当准备模型的控制器,并使用JSP作为视图来表示模型。该JSP依次被转发调用。这是通过以下方式实现的:

这实际上并不反映浏览器地址栏中JSP的URL。这完全发生在服务器端。基本上,servlet加载JSP并将请求/响应传递给它,以便它能够完成生成HTML内容的工作。请注意,上面示例中的JSP隐藏在/WEB-INF文件夹中,这使得最终用户无法在浏览器地址栏中输入其完整路径

在一般的web开发世界中,术语转发也被称为URL转发,它本质上与URL重定向相同。这反过来确实会导致浏览器地址栏发生更改。这在JSP/Servlet世界中更正式地称为重定向,尽管大多数初学者最初将其与转发混淆。这是通过以下方式实现的:

基本上,服务器通过带有位置头的HTTP3NN响应告诉客户机,客户机应该在给定位置上发出新的GET请求。上述内容实际上与以下内容相同:

response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
由于是客户端webbrowser被指示执行该任务,因此您可以在浏览器地址栏中看到此URL更改

URL重写这个术语也不明确。在JSP/Servlet世界中,URL重写是将会话ID附加到URL的形式,这样无Cookie浏览器仍然可以维护与服务器的会话。你可能会看到一个;jsessionid=URL中的somehexvalue属性。默认情况下,这不是自动完成的,但大多数基于Servlet的MVC框架都会自动完成。这是由或:

这反过来又是一个模棱两可的术语。使用你通常会想到的URL编码。没有Servlet API提供这方面的工具,这通常是由JSTL在JSP中使用MVC或基于Servlet的MVC框架(如JSF)提供的任何UI组件来完成的

在一般的web开发环境中,尤其是使用ApacheHTTPD/PHP的人,URL重写更像是ApacheHTTPD的mod_rewrite所做的事情:将传入的URL映射到具体的资源,而不反映客户端的URL更改。在JSP/Servlet世界中,这也是可能的 通常由使用RequestDispatcherforward的过滤器实现完成。一个众所周知的实现是


我承认,当我刚开始使用JSP/Servlet时,这也让我困惑了很长一段时间,这是肯定的,因为我扎根于ApacheHttpd/PHP世界。

在这个问题中,术语转发是不明确的。在JSP/Servlet世界中,转发更多地是从MVC概念中了解的,即浏览器地址栏中可见的请求URL有效地调用Servlet,并与web.xml中的URL模式匹配,或者充当准备模型的控制器,并使用JSP作为视图来表示模型。该JSP依次被转发调用。这是通过以下方式实现的:

这实际上并不反映浏览器地址栏中JSP的URL。这完全发生在服务器端。基本上,servlet加载JSP并将请求/响应传递给它,以便它能够完成生成HTML内容的工作。请注意,上面示例中的JSP隐藏在/WEB-INF文件夹中,这使得最终用户无法在浏览器地址栏中输入其完整路径

在一般的web开发世界中,术语转发也被称为URL转发,它本质上与URL重定向相同。这反过来确实会导致浏览器地址栏发生更改。这在JSP/Servlet世界中更正式地称为重定向,尽管大多数初学者最初将其与转发混淆。这是通过以下方式实现的:

基本上,服务器通过带有位置头的HTTP3NN响应告诉客户机,客户机应该在给定位置上发出新的GET请求。上述内容实际上与以下内容相同:

response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
由于是客户端webbrowser被指示执行该任务,因此您可以在浏览器地址栏中看到此URL更改

URL重写这个术语也不明确。在JSP/Servlet世界中,URL重写是将会话ID附加到URL的形式,这样无Cookie浏览器仍然可以维护与服务器的会话。你可能会看到一个;jsessionid=URL中的somehexvalue属性。默认情况下,这不是自动完成的,但大多数基于Servlet的MVC框架都会自动完成。这是由或:

这反过来又是一个模棱两可的术语。使用你通常会想到的URL编码。没有Servlet API提供这方面的工具,这通常是由JSTL在JSP中使用MVC或基于Servlet的MVC框架(如JSF)提供的任何UI组件来完成的

在一般的web开发环境中,尤其是使用ApacheHTTPD/PHP的人,URL重写更像是ApacheHTTPD的mod_rewrite所做的事情:将传入的URL映射到具体的资源,而不反映客户端的URL更改。在JSP/Servlet世界中,这也是可能的,通常由使用RequestDispatcherforward的过滤器实现来完成。一个众所周知的实现是


我承认,当我刚开始使用JSP/Servlet时,这也让我困惑了很长时间,当然,我的根是Apache HTTPD/PHP世界。

你关于转发的回答适用于重定向而不是转发。@ace:看我发表的文章的第一句话:URL重定向,也称为URL转发。。。它们是相同的概念。如果这不是你所说的转发,你真的需要澄清你所指的转发的任意定义。马克,我不确定你是否也读过我的答案,但我建议你也读一下,以消除你在具体问题上的明显困惑。您似乎从未真正与JSP/Servlets密切合作过。@Balus:很久以前,我阅读了您的答案并对其进行了投票。你在OP澄清了URL转发的含义后几个小时才回答。虽然它在处理servlet类本身时可能有第二种含义,但URL转发(正如我所描述的,您也在回答中所做的)在servlet的上下文中仍然非常相关,我的回答也是如此,重点是servlet适合的位置。我不认为我的回答是对这个问题的不合理解释。你关于转发的回答适用于重定向而不是转发。@ace:看我发表的文章的第一句话:URL重定向,也称为URL转发。。。它们是相同的概念。如果这不是你所说的转发,你真的需要澄清你所指的转发的任意定义。马克,我不确定你是否也读过我的答案,但我建议你也读一下,以消除你在具体问题上的明显困惑。您似乎从未真正与JSP/Servlets密切合作过。@Balus:很久以前,我阅读了您的答案并对其进行了投票。你在OP澄清了URL转发的含义后几个小时才回答。虽然它在处理servlet类本身时可能还有第二个含义,但URL转发正如我和您所描述的一样
作为回答的一部分,您的回答在servlet的上下文中仍然非常相关,我的回答也是这样的,重点是servlet适合的位置。我不认为我的回答是对这个问题的不合理解释。你的假设是错误的。转发/重定向是通过向浏览器返回一个3xx和一个新的URL来完成的。您的假设是错误的。转发/重定向是通过向浏览器返回一个3xx和一个新的URL来完成的。
response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
String encodedURL = response.encodeURL(url); // or response.encodeRedirectURL(url)
// Then use this URL in links in JSP or response.sendRedirect().