请求转发和重定向

1、请求转发

这里的“请求”是名词,请求转发指客户端浏览器向Web服务器端发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的),服务器端对该资源进行处理后反馈给客户端。
下面是实验代码request.jsp,result.jsp,DataServlet1.class

//request.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="./DataServlet1">发出请求</a>
</body>
</html>
//result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("key") %>
</body>
</html>
//DataServlet1.class
public class DataServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
     
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("key", "1000");
		request.getRequestDispatcher("result.jsp").forward(request, response);
	}
}

执行流程:点击“发出请求”链接,请求传到DataServlet1.class,设置key值为1000,然后请求转发给result.jsp,result.jsp显示出key值。
验证一下:
在这里插入图片描述
我们打开request.jsp界面时此时Request URL:http://127.0.0.1/blog/request.jsp,
因为我们要访问这个页面,所以请求地址就是这个界面的地址。之后点击“发出请求”
在这里插入图片描述
发现Request URL: http://127.0.0.1/blog/DataServlet1
然后浏览器中显示:
在这里插入图片描述
显示出request.jsp的内容,请求只发出了一次,证明请求转发只是将“请求”转发,其中没有新请求创建。

2、重定向

客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用HttpServletResponse的sendRedirect()方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器;客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址以GET方式再次向Web应用服务器端发请求,此时地址栏URL发生变化,服务器端接收到新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。

//request.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="./DataServlet1">发出请求</a>
</body>
</html>
//result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getAttribute("key") %>
</body>
</html>
//DataServlet1.class
public class DataServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
     
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("key", "1000");
		response.sendRedirect("result.jsp");
	}
}

此时我们再次点击“发出请求”发现:
在这里插入图片描述
浏览器显示结果为null
查看浏览器中NetWork:
在这里插入图片描述
302 未找到,并且下面还有一项result.jsp,再次观察浏览器界面发现地址已经变为http://127.0.0.1/blog/result.jsp,证明在此过程中有两个请求,客户端发送了两个请求,而request.setAttribute(“key”, “1000”);是第一个请求设置key值,
在result.jsp中request.getAttribute(“key”)是对第二个请求对象的操作,所以浏览器显示null。

3、区别

我们使用请求转发方式来访问外部网站时会发现:
在这里插入图片描述
我们使用重定向方式来访问外部网站时发现:
在这里插入图片描述
可以跳转到外部网站。
当我们将result.jsp放入web项目中的WEB-INF的文件夹下,使用response.sendRedirect(“WEB-INF/resule.jsp”);访问,发现:
在这里插入图片描述
使用request.getRequestDispatcher(“WEB-INF/resule.jsp”).forward(request, response);访问,发现:
在这里插入图片描述
可以访问。
1、重定向:当客户端向服务器发送一个请求,请求地址发生了变化(),服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。采用重定向的方式进行处理,客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。
请求转发:客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。采用请求转发的方式,客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址
2、请求转发方式处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源,而重定向没有这个限制。
3、重定向无法再新的页面获取request.setAttribute中保存的数据,请求转发可以。
4、Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值