当前位置: 首页 > news >正文

重定向和转发的区别

重定向

1、定义

用户通过浏览器发送一个请求,Tomcat服务器接收这个请求,会给浏览器发送一个状态码302,并设置一个重定向的路径,浏览器如果接收到了这个302的状态码以后,就会去自动加载服务器设置的路径

一个页面跳转到另外一个页面(应用场景)、登录页面跳转到主页面: login.jsp====>LoginServlet====>main.jsp

2、特征

①重定向的过程是浏览器(客户端)的行为

②实际上浏览器做了2次请求(当点击登录按钮的时候做了两次请求)(分别是请求login和main.jsp)

③注意上一次请求的request对象会丢失

④重定向有一个非常明显的特征,即浏览器的url变化了

3、核心代码

重定向就一句核心代码

response.sendRedirect("main.jsp"); 
//就这一行代码,但是这一行代码必须写在doGet或者doPost方法中

4、测试

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--请求RedirectServlet--%>
<form action="redirect" method="post"><input type="text" name="username"/><br><input type="text" name="password"/><br><input type="submit" value="提交">
</form>
</body>
</html>

RedirectServlet

package com.by.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RedirectServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置字符编码request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String password = request.getParameter("password");request.setAttribute("username", username);request.setAttribute("password", password);//登录以后跳转到主页//重定向//这个TestLoginServlet里面的数据是不能传给target.html的response.sendRedirect("main.jsp");}
}

web.xml

 <servlet><servlet-name>redirect</servlet-name><servlet-class>com.by.servlet.RedirectServlet</servlet-class></servlet><servlet-mapping><servlet-name>redirect</servlet-name><url-pattern>/redirect</url-pattern></servlet-mapping>

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
这是main页面<br>
<%--
<%=request.getAttribute("username")%>
<%=request.getAttribute("password")%>
--%>${username}
${password}
</body>
</html>

测试

转发

1、定义

用户发送数据请求到服务器,服务器接收当前请求,会调用内部方式(转发)处理该请求,最终把响应给客户端

2、特征

①转发是服务器的行为

②浏览器在这个过程中只有一次行为

③转发可以带有数据 request对象中

④url不会发生任何的变化

3、核心代码

request.getRequestDispatcher(“main.jsp”).forward(request,response);
//这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活

4、测试

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%--请求ForwardServlet--%>
<form action="forward" method="post"><input type="text" name="username"/><br><input type="text" name="password"/><br><input type="submit" value="提交">
</form>
</body>
</html>

ForwardServlet

package com.by.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ForwardServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置字符编码request.setCharacterEncoding("utf-8");String username = request.getParameter("username");String password = request.getParameter("password");request.setAttribute("username", username);request.setAttribute("password", password);//登录以后跳转到主页//重定向//这个TestLoginServlet里面的数据是不能传给target.html的request.getRequestDispatcher("main.jsp").forward(request, response);}
}

web.xml

  <servlet><servlet-name>forward</servlet-name><servlet-class>com.by.servlet.ForwardServlet</servlet-class></servlet><servlet-mapping><servlet-name>forward</servlet-name><url-pattern>/forward</url-pattern></servlet-mapping>

main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
这是main页面<br>
${username}
${password}
</body>
</html>

测试

总结

转发用forword  重定向用redirect

1.请求次数

	转发:只请求一次      重定向:请求两次

2.地址栏变化:

	转发:地址栏不发生变化     重定向:地址栏发生变化

3.发生位置

转发:发生在服务器而浏览器全然不知    重定向:发生在浏览器

4.访问资源

	转发:只能访问当前服务器的资源     重定向:可以访问其他服务器的资源

5.资源共享

转发:可以使用request对象来共享资源
重定向: 不能使用request对象共享资源

http://www.lryc.cn/news/269719.html

相关文章:

  • 基于ElementUI二次封装弹窗组件
  • linux cat命令改变功能显示当前文件行号
  • Django-REST-Framework 如何快速生成Swagger, ReDoc格式的 REST API 文档
  • SpringBoot当中的Singleton和Prototype详解
  • LeetCode第1题 - 两数之和
  • (14)Linux 地址空间的理解
  • Java中的设计模式
  • Hadoop(2):常见的MapReduce[在Ubuntu中运行!]
  • Unity | 快速修复Animation missing错误
  • ssm基于web的志愿者管理系统的设计与实现+vue论文
  • C++运算符重载(插入and提取)
  • C#高级 08Json操作
  • 封装uniapp签字板
  • Mybatis行为配置之Ⅳ—日志
  • Java设计模式-外观模式
  • js+css实现颜色选择器
  • Go语言中的包管理工具之Go Modules的使用
  • 【c/c++】指针例图基础详解
  • TCP/IP的网络层(即IP层)之IP地址和网络掩码,在视频监控系统中的配置和应用
  • 代码随想录刷题 | Day1
  • 查看IOS游戏FPS
  • 挑战Python100题(7)
  • HarmonyOS自学-Day4(TodoList案例)
  • LTPI协议的理解——2、LTPI实现的底层架构
  • CentOS 8.2 安装 Mysql 5.7.26(单机)
  • Vue Tinymce富文本组件自定义带下拉框的操作按钮
  • YOLOv5算法进阶改进(10)— 更换主干网络之MobileViTv3 | 轻量化Backbone
  • Java UDP
  • Halcon阈值处理的几种分割方法threshold/auto_threshold/binary_threshold/dyn_threshold
  • FB混合C语言编译