Skip to content

重定向和转发 ​

本文将详细介绍在 tio-boot 中如何实现请求的 重定向 与 转发,并提供详细的示例代码和说明。通过本文,将了解两者的区别、适用场景以及具体的实现方法。


一、重定向 (Redirect) ​

1.1 概念说明 ​

重定向 是服务器告诉客户端(例如浏览器),“请求的资源已临时或永久移动到另一个 URL,请重新发起请求到该 URL”。重定向时,服务器返回一个 302 Found 或 301 Moved Permanently 状态码,并在响应头中包含 Location 字段,指向新的地址。客户端收到响应后,会自动根据 Location 再次发起请求。

重定向的特点包括:

  • 客户端行为:重定向由客户端发起新的请求,浏览器地址栏会发生变化。
  • 跨域支持:可以重定向到站外地址。
  • 适用场景:例如用户认证成功后重定向到首页,或者资源已移动时通知客户端新的地址。

1.2 tio-boot 中的重定向示例 ​

下面的代码示例展示了如何在 tio-boot 中实现重定向,将请求重定向到百度首页:

java
import nexus.io.annotation.Get;
import nexus.io.annotation.RequestPath;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpResponse;

@RequestPath("/redirect")
public class RedirectController {

  @Get
  public HttpResponse index() {
    // 从上下文中获取 HttpResponse 对象
    HttpResponse response = TioRequestContext.getResponse();
    // 执行重定向,跳转到百度首页
    response.sendRedirect("http://www.baidu.com");
    return response;
  }
}

执行效果 ​

使用 curl 命令进行请求后,返回结果如下:

bash
curl -v http://localhost/redirect
* Host localhost:80 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:80...
* Connected to localhost (::1) port 80
> GET /redirect HTTP/1.1
> Host: localhost
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 302 Found
< server: t-io
< date: Tue, 11 Feb 2025 23:00:35 GMT
< content-length: 0
< location: http://www.baidu.com
<
* Connection #0 to host localhost left intact

解释:

  • HTTP 状态码:返回 302 Found,表示临时重定向。
  • Location 头:指向 http://www.baidu.com,客户端收到后会自动发起新的请求到该地址。

二、转发 (Forward) ​

2.1 概念说明 ​

转发 是服务器内部将请求分派给另一个资源进行处理,整个过程对客户端是透明的,客户端并不知道请求被转发。转发特点包括:

  • 服务器内部操作:转发在服务器内部完成,客户端只看到最终的响应结果。
  • 地址栏不变:客户端浏览器地址栏不会改变,因为请求并未离开服务器。
  • 适用场景:通常用于在同一个应用内,将请求分发到不同的处理逻辑,或是将请求交给另一个组件处理。

2.2 tio-boot 中的转发示例 ​

以下代码展示了如何使用 tio-boot 实现请求的转发,将请求转发到应用内的其他处理程序:

java
import nexus.io.annotation.Get;
import nexus.io.annotation.RequestPath;
import nexus.io.tio.boot.http.TioRequestContext;
import nexus.io.tio.http.common.HttpRequest;
import nexus.io.tio.http.common.HttpResponse;

@RequestPath("/forward")
public class ForwardController {

  @Get
  public HttpResponse forward() {
    // 从上下文中获取 HttpRequest 对象
    HttpRequest request = TioRequestContext.getRequest();
    HttpResponse forward = null;
    try {
      // 转发请求到根路径("/"),由其他处理程序处理该请求
      forward = request.forward("/");
    } catch (Exception e) {
      e.printStackTrace();
    }
    return forward;
  }
}

执行效果 ​

使用 curl 命令请求后,服务器最终返回的内容为:

bash
curl -v http://localhost/forward
index

解释:

  • 请求被转发到 / 路径,由对应的处理程序处理并返回 "index" 字符串。
  • 客户端只看到最终的返回内容,并不知道内部经过了转发处理。

三、总结 ​

在 tio-boot 中实现请求的重定向与转发非常简单,主要区别在于:

  • 重定向:通过 HttpResponse.sendRedirect(url) 方法实现。服务器返回重定向状态码和 Location 头,客户端接到响应后发起新的请求。适用于跨域跳转或资源迁移的场景。
  • 转发:通过 HttpRequest.forward(path) 方法实现。服务器内部将请求转发给其他处理程序,客户端不感知转发过程,地址栏保持不变。适用于应用内部的请求分发或逻辑重用。

希望本文对理解 tio-boot 中的转发与重定向有所帮助,能够在实际开发中灵活应用这两种技术。

MIT Licensed