重定向的概念
重定向:客户端向web资源A发送请求之后,web资源A通知客户端去访问web资源B,这个过程就是重定向。
我们需要注意的是:重定向过程中客户端向服务器发送了两次请求,所以重定向之后的请求路径会发生改变,第一次请求发送给web资源B,在收到了B返回的响应之后,得知需要访问web资源C,之后又向web资源C发送请求。
重定向常见的应用场景:用户登录等等。
为了更加直观的了解重定向,我们可以做一个简单的案例。
案例步骤:
- 创建一个请求转发的servlet,将请求转发给我们上一章做的验证码案例
- 启动服务器测试
请求转发案例代码:
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RedirectServlet extends HttpServlet {
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("radom");//我们如果输入的参数之前没有加‘/’,那么重定向的路径会是对应servlet路径
// 如果我们在输入参数之前加‘/’,那么我们重定向的路径是 localhost+输入的参数
// resp.sendRedirect("/servlet_03_war/radom");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
案例结果:
我们需要注意的是,resp.sendRedirect()
这个方法的参数可以是对应重定向servlet的相对于localhost的URL路径,也可以是对应servlet在项目内的URL路径,他们的区别是参数字符串是否以“/”开头。
重定向本质做的操作:
resp.setHeader("Location","/r/img");
resp.setStatus(HttpServletResponse.SC_ACCEPTED);
面试题:请聊聊重定向和请求转发的区别?
相同点:
- 页面都会实现跳转
不同点:
- 重定向的地址栏会发生变化,请求转发的地址栏不会发生变化
- 重定向是请求发送给web资源A后,客户端接受到了返回的响应,并且根据获得的响应去向web资源B发送响应,整个过程中发送了两次请求。
- 请求转发是客户端发送给web资源A,web资源A在接受到了请求之后,将请求转发给web资源B,web资源B处理完毕之后将响应返回给web资源A,web资源A在接受响应之后再将响应返回给客户端,整个过程中仅仅发送了一个请求。
重定向:
请求转发: