IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> springmvc中请求的转发和重定向 -> 正文阅读

[网络协议]springmvc中请求的转发和重定向

本文转载自:https://blog.csdn.net/qq_39095899/article/details/106034954

转发和重定向

重定向 redirect

/*
 * 之前的写法
 * response.setStatus(302);
 * response.setHeader("Location", "login_success.html");
 */

// 重定向写法: 重新定位方向 参数即跳转的位置
response.sendRedirect("login_success.html");
  • 浏览器地址栏显示的是最后的那个资源的路径地址,会发生改变
  • 请求次数最少有两次, 服务器在第一次请求后,会返回 302 以及一个地址 Location, 浏览器在根据这个地址,执行第二次访问
  • 可以跳转到任意路径;不是自己的工程下的路径也可以跳
  • 重定向 无法 将请求域中的数据带到目标页面(没法使用上一次的 request 对象,因为这是两次不同的请求)

转发 forward

// 请求转发的写法: 参数即跳转的位置
RequestDispatcher rd = request.getRequestDispatcher("login_success.html");
rd.forward(request, response);
  • 浏览器地址栏显示的还是转发之前的地址,不会变
  • 请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作
  • 只能跳转自己项目的资源路径
  • 请求转发 可以 将请求域中的数据带到目标页面(使用的始终是同一个 request 对象,对客户端来说只发了一次请求,那就只有一个 request 对象)

重定向和转发对比

在这里插入图片描述
转发和重定向的区别:

  • 转发在一次请求中完成;重定向是两次请求
  • 转发操作发生在服务器内部;重定向是浏览器执行操作
  • 转发浏览器地址栏不变(只有一次请求,一个地址);重定向浏览器地址栏变化(两次请求,两个地址)
  • 转发可以在一次请求中共享数据;重定向不行(重定向两次请求,每次都会创建新的 request 对象)

代码测试

index.jsp 页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>导航页</title>
</head>
<body>

	<a href="jump?action=forward">请求转发</a> <br />
	<a href="jump?action=redirect">重定向</a>
	<hr />
</body>
</html>

target.jsp 页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>请求转发、重定向 — 目标页面</title>
</head>
<body>

	<h1>我是target.jsp</h1>
	
	通过请求作用域传过来的参数(man):${man }

</body>
</html>

JumpPageServlet

@WebServlet(description = "请求转发和重定向示例", urlPatterns = { "/jump" })
public class JumpPageServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String action = request.getParameter("action");
		switch(action) {
		case "redirect":
			// 重定向
			doRedirect(request, response);
			break;
		case "forward":
			doForward(request, response);
			break;
		default:
			break;
		}
	}

	// 通过请求转发的方式跳转页面
	private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 请求转发到target.jsp页面
		request.setAttribute("man", "黑旋风 . 李逵");
		request.getRequestDispatcher("target.jsp").forward(request, response);
//		request.getRequestDispatcher("https://www.baidu.com").forward(request, response);
		
	}
	
	// 通过重定向的方式跳转页面
	private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 重定向到target.jsp页面
		// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)
		// 就好比如下代码:
		// Student stu1 = new Student();
		// stu1.setSname("宋江");
		// Student stu2 = new Student();
		// System.out.println(stu2.getSname());
		request.setAttribute("man", "黑旋风 . 李逵");
		response.sendRedirect("target.jsp");
		
		
		// 重定向不仅可以调到项目内部地址,还能调到任意地址
		//设置重定向响应头 // response.setHeader("location","http://www.taobao.com");
		//设置状态码 //response.setStatus(302);
		//============上面代码的简化方式====================== 
		//response.sendRedirect("http://www.taobao.com");
//		response.setHeader("Refresh"," 3;url=http://www.jd.com"); 
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request, response);
	}
}

测试

重定向

在浏览器中访问你项目下的 index.jsp

在这里插入图片描述

点击重定向,结果如下所示

在这里插入图片描述
地址上显示的是最后的那个资源的路径地址,可以看出得不到域中得值 黑旋风 . 李逵,重定向无法将请求域中的数据带到目标页面

  • 没法使用上一次的 request 存储的数据,
  • 确切的说是没法使用上一次的request对象,因为这是两次不同的请求

转发

返回导航页 index.jsp 中点击请求转发可以看到结果如下

在这里插入图片描述
可以获取到作用域中的值,并且地址栏中的地址没有发生变化。请求转发可以将请求域中的数据带到目标页面

重定向可以跳转任意路径

private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {
		// 重定向到target.jsp页面
		// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)
		// 就好比如下代码:
		// Student stu1 = new Student();
		// stu1.setSname("宋江");
		// Student stu2 = new Student();
		// System.out.println(stu2.getSname());
		request.setAttribute("man", "黑旋风 . 李逵");
		//response.sendRedirect("target.jsp");
		
		
		// 重定向不仅可以调到项目内部地址,还能调到任意地址
		//设置重定向响应头 // response.setHeader("location","http://www.taobao.com");
		//设置状态码 //response.setStatus(302);
		//============上面代码的简化方式======================
		//上面那个重定向关闭下面两个打开一个就可以看到结果 
		//重定向跳转淘宝主页
		//response.sendRedirect("http://www.taobao.com");
		//当前页面停留3秒钟之后跳转到京东首页
		response.setHeader("Refresh"," 3;url=http://www.jd.com"); 
}

重定向成功

在这里插入图片描述

转发不可以跳转任意路径只能是自己项目下的

测试如下把之前的注释上打开下面那个

private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 请求转发到target.jsp页面
		request.setAttribute("man", "黑旋风 . 李逵");
//		request.getRequestDispatcher("target.jsp").forward(request, response);
		request.getRequestDispatcher("https://www.baidu.com").forward(request, response);
		
}

转发百度失败

在这里插入图片描述

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:09:53  更:2021-10-04 13:10:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/29 8:26:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码