Solon

二十、forward 和 redirect 的区别

1、Context::forward

forward 是在服务端,把当前请求“路径”(比如:/)转换为一个“新路径”(比如:/index)(是当前服务端的路径),通过 Solon.app().tryHandle() 再执行一次;

客户端对它的感觉是:

  • 请求只发生一次
  • 请求的地求没变化(例:请求的是 /)

内部实现代码:

public void forward(String pathNew) {
    pathNew(pathNew); //新地址,必须是路由器内存在的

    Solon.app().tryHandle(this);
    setHandled(true);
    setRendered(true);
}

Solon 是不支持 ContextPath 特性的。平时通过 ContextPathFilter 进行效果模拟,其内部就是基于 pathNew 这个特性实现的。

2、Context::redirect

redirect 是服务端,输出头信息 Location=“新地址”(例如:/index)和 头信息 Status=302,通知客户端用“新地址”再发起一次请求

客户端对它的感觉是:

  • 请求了两次
  • 请求的地求也变化了
  • 可以跳转到其它域名的地址

内部实现代码:

public void redirect(String url) {
    redirect(url, 302);
}

public void redirect(String url, int code) {
    headerSet("Location", url); //可以是相对地址,也可以是绝对地址;也可以是其它域的地址
    status(code);
}