ace*_*ace 1 java servlets http
作为Java Web应用程序的开发人员,我何时需要使用URL重写以及URL重写和转发之间的区别?
我在其他网站上搜索,我得到的是相互矛盾的信息,这取决于你所说的人,SEO人会以不同的方式回答这个问题.
在两种情况下,AFAIK都不会通知客户端(浏览器)更改,并且最终用户看到客户端在从服务器返回休止符时最初请求的完全相同的URL.
请问这个问题是在Java Servlet API的上下文中,其中定义了forward方法和sendRedirect方法,其中重定向和转发完全是两个不同的东西.这个问题是关于forward(由Servlet API中的forward方法定义)和URL重写之间的区别.问题清楚地表明答案应该在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);
Run Code Online (Sandbox Code Playgroud)
这确实没有反映浏览器地址栏中的JSP的URL.这完全发生在服务器端.基本上,servlet"加载"JSP并将请求/响应传递给它,以便它可以完成生成HTML内容的工作.请注意,上例中的JSP隐藏在/WEB-INF
文件夹中,这使得尝试在浏览器地址栏中输入完整路径的最终用户无法访问它.
在一般的Web开发世界中,术语"转发" 也可从"URL转发"中获知,其与URL重定向基本相同.这反过来确实导致浏览器地址栏的更改.这在JSP/Servlet世界中更正式地称为"重定向"(尽管大多数初学者最初将其与"转发"混淆).这是通过HttpServletResponse#sendRedirect()
:
response.sendRedirect("another-servlet-url");
Run Code Online (Sandbox Code Playgroud)
基本上,服务器通过带有Location
标头的HTTP 3nn响应告诉客户端客户端应该在给定的情况下发出新的GET请求Location
.以上内容实际上与以下内容相同:
response.setStatus(302);
response.setHeader("Location", "another-servlet-url");
Run Code Online (Sandbox Code Playgroud)
由于是指示执行该作业的客户端(webbrowser),您会看到此URL更改反映在浏览器地址栏中.
术语"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().
Run Code Online (Sandbox Code Playgroud)
(这反过来是-again-一个含糊不清的术语.使用"URL编码"你通常会想到百分比编码.没有为此提供Servlet API的工具,这通常是通过URLEncoder#encode()
或者MVC 完成的,技术上更正确,在JSP中由JSTL <c:url>
和/ <c:param>
或基于servlet的MVC框架提供的任何UI组件,例如JSF <h:outputLink>
)
在一般的Web开发世界中(特别是使用Apache HTTPD/PHP人员),"URL重写"更为人所知的mod_rewrite
是Apache HTTPD 正在做的事情:将传入的URL映射到具体资源而不反映客户端的URL更改.在JSP/Servlet世界中,这也是可能的,它通常由使用的Filter
实现来完成RequestDispatcher#forward()
.众所周知的实现是Tuckey的URLRewriteFilter.
我承认,当我刚刚开始使用JSP/Servlet时,这也让我很困惑,当然我在Apache HTTPD/PHP世界中扎根了.
归档时间: |
|
查看次数: |
3101 次 |
最近记录: |