重定向(Redirect)
重定向的含义:
-
客户端浏览器向Web应用服务器端发送一个请求,Web服务器端使用
HttpServletResponse的sendRedirect()
方法将结果(结果中头信息内HTTP状态码为302,Location响应报头域中保存响应回来的地址)返回客户端浏览器; -
客户端浏览器收到服务器端结果后解析其头部信息,然后自动按照头部指定地址
以GET方式
再次向Web应用服务器端发请求,
此时地址栏URL发生变化
,服务器端接收到在这里插入代码片
新的请求再将结果返回至客户端浏览器,客户端浏览器解释执行返回结果并将执行结果显示给用户,至此该过程结束。
请求转发(Forward)
- 这里的“请求”是名词。
- 请求转发指
客户端浏览器向Web服务器端
发送请求,服务器端收到请求后进行相应处理后再将该请求转发到另外的资源(即这一“转发”操作是在Web服务器端执行的
),服务器端对该资源进行处理后反馈给客户端。
两者区别
-
重定向:当客户端向服务器发送一个请求,请求地址发生了变化,服务器向客户端返回了一个继续处理的新地址,此时客户端自动(不需要人工参与)访问服务器的新地址,服务器将新地址的内容返回给客户端。
-
请求转发:请求转发客户端向服务器端发送一个请求,请求地址发生了变化,服务器调用内部的方法直接将请求转发给新地址进行处理,然后将处理结果反馈给客户端。
1、两种不同方式导致客户端与服务器的执行次数不一样
采用重定向的方式进行处理
:客户端和服务器端共执行了两次请求和两次响应,且浏览器地址栏显示的是第二次访问的新地址。
采用请求转发的方式
:客户端和服务器端只执行了一次请求和一次响应,且浏览器地址栏显示的是第一次访问的原地址。
2、访问的Web应用资源范围不同
请求转发
:处理页面跳转,跳转的新地址必须是本Web应用系统的资源,不可以访问其他Web应用的资源。
重定向
:没有这个限制,可以访问外网。
3、重定向无法再新的页面获取request.setAttribute中保存的数据,请求转发可以。
4、Web项目中WEB-INF文件夹是最安全的目录,该目录内的资源只能通过请求转发获取,重定向的方式无法获取。
举例
运行程序
1、进入index.jsp
页面后,点击链接后
2、重定向方法:先跳转到TestServlet【302】,再跳转到target.jsp页面,不显示【Tom】
3、请求转发方式:直接到达TestServlet,显示【Tom】
package com.jd.cn;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("name", "Tom");
//response.sendRedirect("https://www.baidu.com");//重定向
//可以直接访问外网
request.getRequestDispatcher("/WEB-INF/target.jsp").forward(request, response);
//若target.jsp在安全目录WEB-INF下,只能用请求转发来访问,重定向不可以
}
}
//demo.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>
<title></title>
</head>
<body>
<%=session.getId() %>
</body>
</html>
//index.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>
<title></title>
</head>
<body>
<a href="./TestServlet">链接</a>
<%=session.getId() %>
</body>
</html>
//target.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>
<title></title>
</head>
<body>
目标页面
${name }
</body>
</html>