forward与redirect的区别

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>
相关文章
相关标签/搜索