Java Web开发——初探利用HttpServletResponse进行重定向

本文通过一个登录示例详细解释了HTTP请求转发和重定向的区别。在登录过程中,用户输入的用户名和密码通过GET方法提交给服务器,然后使用重定向将页面跳转至/success,显示成功信息。重定向的特点是浏览器URL发生改变,并通过HTTP响应头的Location字段和状态码302指示浏览器执行新的请求。这个过程揭示了数据安全性问题,因为GET方法会将敏感信息暴露在URL中。
摘要由CSDN通过智能技术生成

在本文的开始,首先需要明确一下请求转发和重定向之间的异同点:

  • 相同点:两者都会出现页面的跳转
  • 不同点:请求转发不会导致浏览器的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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值