问题: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 特性的,其内部就是基于 pathNew 这个特性实现的。forward 执行时,会重新经过 filter, routerInterceptor。也可以通过 filter 实现相同效果,例:
public class DemoFilter implements Filter {
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
if ("/".equals(ctx.pathNew())){
ctx.pathNew("/index");
}
chain.doFilter(ctx);
}
}
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);
}