Servlet重定向
重定向属于客户端行为。服务器在收到客户端请求后,会通知客户端浏览器重新向另外一个 URL 发送请求,这称为请求重定向。它本质上是两次 HTTP 请求,对应两个 request 对象和两个 response 对象。
重定向的工作流程
重定向的工作流程如下:
用户在浏览器中输入 URL,请求访问服务器端的 Web 资源。
服务器端的 Web 资源返回一个状态码为 302 的响应信息,该响应的含义为:通知浏览器再次发送请求,访问另一个 Web 资源(在响应信息中提供了另一个资源的 URL)。
当浏览器接收到响应后,立即自动访问另一个指定的 Web 资源。
另一 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 时验证成功,否则验证失败),这里我们输入错误的验证码点击提交按钮,结果如下图。

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

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