转发与重定向

平常开发中时常用到重定向,正好借此总结一下,上面的图在开发中以及参考网上文章总结出来的(参考文章见文末)。

重定向

@RequestMapping(value = "/redirect",method = RequestMethod.GET)
@ResponseBody
public String redirect(HttpServletResponse response){
    try {
        response.sendRedirect("http://127.0.0.1:8080/api/redirect/test");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "redirect";
}
@RequestMapping(value = "/redirect/test",method = RequestMethod.GET)
@ResponseBody
public String redirectTest(HttpServletRequest request, HttpServletResponse response){
    return "redirect success";
}

项目启动成功后,在浏览器输入 http://127.0.0.1:8080/api/redirect,在chrome检查Network栏目下,可以看到:

客户端发生了两次接口请求,第一次是 http://127.0.0.1:8080/api/redirect,第二次是 http://127.0.0.1:8080/api/redirect/test;且第一次接口请求的响应状态码为302(重定向),从其请求、响应头中可以清晰交互流程:

从上面分析,重定向时,进行了两次接口请求;过程简单理解为浏览器首先请求接口A,接口A进行了重定向到B,接口A给浏览器的响应状态码为302,并且返回了目的接口地址B,然后浏览器再次发起请求,请求接口地址B.

转发

@RequestMapping(value = "/forward",method = RequestMethod.GET)
@ResponseBody
public String forward(HttpServletRequest request, HttpServletResponse response){
    try {
        request.getRequestDispatcher("/api/forward/test").forward(request,response);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ServletException e) {
        e.printStackTrace();
    }
    return "index";
}
@RequestMapping(value = "/forward/test",method = RequestMethod.GET)
@ResponseBody
public String forwardTest(HttpServletRequest request, HttpServletResponse response){
    return "forward success";
}

在浏览器中访问 http://localhost:8080/api/forward,会返回 forward success,在chrome检查Network栏目下:

浏览器只请求了一次接口,请求地址没有发生变化;而且只能转发给当前的WEB应用资源。

总结

  1. 重定向是客户端行为,转发是服务器行为
  2. 转发只发生一次请求;且只能转发到当前应用资源;请求地址不会发生变化
  3. 重定向发生两次请求;且能重定向到任何资源;地址栏会发生变化
  4. 转发速度快于重定向

参考文章

  1. https://blog.csdn.net/daochuwenziyao/article/details/54233496
  2. https://blog.csdn.net/webzhuce/article/details/54564608

原文发布于微信公众号 - 后端沉思录(LiosWangs)

原文发表时间:2018-10-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第七节 - 学生管理系统项目搭建

31370
来自专栏运维

Redis3.0.7集群部署完整版

Redis集群没有出来前,一直使用Codis集群,现在部署Redis集群看看效果如何。

31320
来自专栏测试开发架构之路

jmeter二次开发

http://jmeter.apache.org/download_jmeter.cgi

68110
来自专栏用户2442861的专栏

用GDB调试程序(一)

http://blog.csdn.net/haoel/article/details/2879

11910
来自专栏猿天地

Spring Boot 使用WebAsyncTask异步返回结果

在Spring Boot中(Spring MVC)下请求默认都是同步的,一个请求过去到结束都是由一个线程负责的,很多时候为了能够提高吞吐量,需要将一些操作异步化...

56020
来自专栏JavaQ

深入Spring Boot (九):Web应用统一异常处理

默认情况下,Spring Boot为基于SpringMVC的Web应用提供了全局统一异常处理,本篇将深入介绍默认的统一异常处理及自定义异常处理,主要包含以下4部...

40780
来自专栏LanceToBigData

细说log4j

可能做过java项目的基本上都是用过log4j,它是用来做java日志的。比如我们做一个项目分为很多的模块,那我们怎么想要知道它什么时候启动了,这时候我们可以使...

34550
来自专栏菩提树下的杨过

maven学习(上)- 基本入门用法

一、下载及安装 1.1 下载maven 3.1.1 先到官网http://maven.apache.org/download.cgi 下载最新版本(目前是3.1...

22880
来自专栏陈树义

Java日志框架那些事儿

在项目开发过程中,我们可以通过 debug 查找问题。而在线上环境我们查找问题只能通过打印日志的方式查找问题。因此对于一个项目而言,日志记录是一个非常重要的问...

78990
来自专栏杂烩

ganglia安装报错解决 原

1、There was an error collecting ganglia data (127.0.0.1:8652): fsockopen error: ...

11310

扫码关注云+社区

领取腾讯云代金券