servlet中经常使用到的两种转向,以前没注意到这两种转向的区别,如今进行下记录与分享。 html
1.从地址显示来讲
forward是服务器请求资源,好比你转向的地址为2.jsp,这时服务器先本身直接访问2.jsp,把这个地址的内容读出来,而后把这些内容再发给浏览器。因此地址栏仍是你访问servlet那个地址栏(若是你用jsp实现地址就不变),它不会变成2.jsp。浏览器不知道这些内容是服务器从地址2.jsp拿过来的。 java
redirect则相反,是服务端根据逻辑,发送一个状态码高速浏览器从新去请求那个2.jsp地址,因此地址栏显示的是新的URL。 跨域
2.从数据共享来讲
forward转发页面和转发到的页面能够共享request里面的内容;redirect不能共享数据。 浏览器
3.从运用地方来讲
forward通常用于用户登陆时候,根据角色转发到相应的模块(由于这时可能须要共享些数据)。
redirect通常用于用户注销登陆时返回主页面和跳转到其余的网站。 服务器
4.forward不能跨域访问,redirect能够跨域访问
可能有些读者还不清楚跨域访问的概念。跨域访问就是post/get不是你本身的网站、域名不一样的访问。 jsp
5.从协议的角度来讲
forward的实现与协议无关。从原理上看,forward是container内部在response以前对request的处理。
而redirect方式是利用http协议中的redirect机制让客户发起新的请求,转向新的url。 post
从这个角度去看二者的区别,天然能很好地解析产生上面四点的不一样的缘由了。 测试
因此,在处理登陆/注销页面的转向时,要注意forward与redirect所带来的不一样效果 网站
下面作了一个例子来验证
逻辑以下1.jsp点击登陆→servlet①给request写入attribute②进行forward或redirect转向→2.jsp
1.jsp url
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <a href="./OutServlet">登陆</a> </body> </html>servlet
public class OutServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //测试是否是共享request request.setAttribute("name", "test"); //进行forward转向 // request.getRequestDispatcher("./2.jsp").forward(request, response); //进行redirect转向 response.sendRedirect("./2.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }2.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP '2.jsp' starting page</title> </head> <body> <p>测试是否是共享reques</p> 结果:<%=request.getAttribute("name")%> </body> </html>