在本文的开始,首先需要明确一下请求转发和重定向之间的异同点:
- 相同点:两者都会出现页面的跳转
- 不同点:请求转发不会导致浏览器的URL出现改变,而重定向会使得浏览器的URL出现改变。
我们首先把Web应用的首页index.jsp进行修改,制作一个输入用户名、密码的输入框,允许用户进行提交:
<html>
<body>
<form action="${pageContext.request.contextPath}/login" method="get">
Username <input type="text" name="username"> <br>
Password <input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
之后,我们创建一个LoginServlet运行于/login之下,接收输入框提交而来的用户名和密码,并将会把页面重定向跳转至/success。
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 LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Enter LoginServlet");
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username + ": " + password);
resp.sendRedirect("/success");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
而/success是由SuccessServlet进行处理的:
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 SuccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Enter SuccessServlet");
resp.getWriter().println("<h1>Success</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
运行结果如下:
执行逻辑如下:首先打开首页,输入用户名和密码,点击提交后,浏览器会把输入的数据通过GET方法提交给服务器上的/login。由于是GET方法,所以这些数据会附加到URL后面:
http://localhost:8080/login?username=admin&password=123456
(这等于是把这些敏感数据明码暴露传输,实际上十分不安全!)
服务器上的/login接收到了数据后,进行重定向,跳转到/success上。于是,用户页面上显示出“Success”的字样。
仔细分析login的HTTP包,它的状态码是302(重定向)。此外,它的响应头内多了一个内容:Location=/success,这就是告诉浏览器要跳转到/success页面。所以,总结起来,重定向无外乎可以归结为两步:第一步,设置Location的URL;第二步,设置状态码为302。
resp.setHeader("Location", "/success"); resp.setStatus(302);