JavaWeb之请求转发和重定向

请求转发和重定向

java 复制代码
// 请求转发
request.getRequestDispatcher(url).forward(req,resp)
// 请求重定向
response.sendRedirect(url)

请求转发forward

请求转发是将一个请求转到服务器的另一个资源,在处理完初步请求另外的资源之后生成响应,使用的是RequestDispatcher.forward方法来实现的,先看一下RequestDispatcher这个接口是什么

RequestDispatcher接口

RequestDispatcher的实例是由Servlet引擎创建的,用于包装一个要被其他资源调用的资源,并可以通过其中的方法将客户端的请求转发给所包装的资源

java 复制代码
public interface RequestDispatcher {

   
    static final String FORWARD_REQUEST_URI = "javax.servlet.forward.request_uri";

    static final String FORWARD_CONTEXT_PATH = "javax.servlet.forward.context_path";

    static final String FORWARD_PATH_INFO = "javax.servlet.forward.path_info";

    static final String FORWARD_SERVLET_PATH = "javax.servlet.forward.servlet_path";

    static final String FORWARD_QUERY_STRING = "javax.servlet.forward.query_string";

    static final String INCLUDE_REQUEST_URI = "javax.servlet.include.request_uri";

    static final String INCLUDE_CONTEXT_PATH = "javax.servlet.include.context_path";

    static final String INCLUDE_PATH_INFO = "javax.servlet.include.path_info";

    static final String INCLUDE_SERVLET_PATH = "javax.servlet.include.servlet_path";

    static final String INCLUDE_QUERY_STRING = "javax.servlet.include.query_string";

    public static final String ERROR_EXCEPTION = "javax.servlet.error.exception";

    public static final String ERROR_EXCEPTION_TYPE = "javax.servlet.error.exception_type";

    public static final String ERROR_MESSAGE = "javax.servlet.error.message";

    public static final String ERROR_REQUEST_URI = "javax.servlet.error.request_uri";

    public static final String ERROR_SERVLET_NAME = "javax.servlet.error.servlet_name";

    public static final String ERROR_STATUS_CODE = "javax.servlet.error.status_code";

  	// 用于将请求转发到RequestDispatcher对象封装的资源
    public void forward(ServletRequest request, ServletResponse response)
        throws ServletException, IOException;

  	// 将RequestDispatcher对象封装的资源作为当前响应的一部分包含进来
    public void include(ServletRequest request, ServletResponse response)
        throws ServletException, IOException;
}

请求重定向sendRedirect

重定向使用的是response.sendRedirect方法,sendRedirect方法会产生一个302的响应码和Location的响应头,从而通知客户端去重新访问Location响应头中指定的URL,此时会创建一个新的请求。一般用于避免用户的非正常访问。

java 复制代码
// 请求重定向
response.sendRedirect(url);

除了可以使用response.sendRedirect方法,还可以通过手动的设置所跳转的地址

java 复制代码
response.setStatus(302);
response.setHeader("Location","所要重定向的地址")

两者的区别

本质区别:请求转发是在服务器内部转发,重定向是在客户端转发

请求转发只向服务器发起一次请求,重定向发起两次请求

  • 请求转发:可以保持request的parameter,attribute这些值

    重定向:丢弃request的parameter,attribute这些值

  • 请求转发:地址是初次发出请求的地址 重定向:地址栏是最后响应的地址

  • 请求转发:在最终的Servlet中,request对象和中转的那个request是同一个对象 重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象

  • 请求转发:只能转发到当前web应用 请求重定向:可以重定向到任何资源

  • 请求转发:/代表当前web应用的根目录 请求重定向:/代表当前web站点的根目录,要使用request.getContextPath()再加上路径

zhhll.icu/2021/javawe...

本文由mdnice多平台发布

相关推荐
xqqxqxxq25 分钟前
背单词软件技术笔记(V2.0扩展版)
java·笔记·python
消失的旧时光-194334 分钟前
深入理解 Java 线程池(二):ThreadPoolExecutor 执行流程 + 运行状态 + ctl 原理全解析
java·开发语言
哈哈老师啊39 分钟前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
4311媒体网42 分钟前
帝国cms调用文章内容 二开基本操作
java·开发语言·php
zwxu_1 小时前
Nginx NIO对比Java NIO
java·nginx·nio
可观测性用观测云2 小时前
Pyroscope Java 接入最佳实践
java
气π3 小时前
【JavaWeb】——(若依 + AI)-基础学习笔记
java·spring boot·笔记·学习·java-ee·mybatis·ruoyi
阿里云云原生3 小时前
AgentScope Java 1.0:从模型到应用,AI Agent 全生命周期管理利器!
java·云原生
running up3 小时前
Maven依赖管理和项目构建工具
java·maven
老华带你飞4 小时前
列车售票|基于springboot 列车售票系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring