Servlet重定向

1年前 (2024-04-28)

重定向属于客户端行为。服务器在收到客户端请求后,会通知客户端浏览器重新向另外一个 URL 发送请求,这称为请求重定向。它本质上是两次 HTTP 请求,对应两个 request 对象和两个 response 对象。

重定向的工作流程

重定向的工作流程如下:

重定向流程图

  1. 用户在浏览器中输入 URL,请求访问服务器端的 Web 资源。

  2. 服务器端的 Web 资源返回一个状态码为 302 的响应信息,该响应的含义为:通知浏览器再次发送请求,访问另一个 Web 资源(在响应信息中提供了另一个资源的 URL)。

  3. 当浏览器接收到响应后,立即自动访问另一个指定的 Web 资源。

  4. 另一 Web 资源将请求处理完成后,由容器把响应信息返回给浏览器进行展示。

转发和重定向的区别

转发和重定向都能实现页面的跳转,但是两者也存在以下区别。

区别

转发

重定向

浏览器地址栏 URL 是否发生改变

是否支持跨域跳转

请求与响应的次数

一次请求和一次响应

两次请求和两次响应

是否共享 request 对象和 response 对象

是否能通过 request 域对象传递数据

速度

相对要快

相对要慢

行为类型

服务器行为

客户端行为

response.sendRedirect()

HttpServletResponse 接口中的 sendRedirect() 方法用于实现重定向。

返回值类型

方法

描述

void

sendRedirect(String location)

向浏览器返回状态码为 302 的响应结果,让浏览器访问新的 URL。若指定的 URL 是相对路径,Servlet 容器会将相对路径转换为路径。参数 location 表示重定向的URL。

示例

下面我们通过一个案例加深对 response 对象和重定向的理解。

在 responseDemo 的 WebContent 中,创建登录页面 login.html,代码如下。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3网站站点" rel="nofollow" />

package net.biancheng.www;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics2D;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 使用 Java 生成验证码图片

* 了解即可

* 可将 demo保存直接使用

* 并通过 response 对象展示在页面上

*

* @author 编程帮 www.biancheng网站站点" rel="nofollow" />

package net.biancheng.www;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

/**

* 验证提交的信息

* @author 编程帮 www.biancheng网站站点" rel="nofollow" />

package net.biancheng.www;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

/**

* 登录失败后,提示错误信息并定时跳转回登录页

* 通过设置响应头字段(refresh)实现页面的定时跳转

*

* @author 编程帮 www.biancheng网站站点" rel="nofollow" />

package net.biancheng.www;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 登录成功

* @author 编程帮 www.biancheng网站站点" rel="nofollow" />


在登录页面输入账号、密码、验证码等信息(该实例中没有使用数据库,所以当账号和密码都为 admin 时验证成功,否则验证失败),这里我们输入错误的验证码点击提交按钮,结果如下图。


点击提交按钮,结果如下图,倒计时完成后,自动跳转到登录页面。


输入正确信息,点击提交,结果如下图。