「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。
本片文章承接上一篇:Servlet 中Response 的使用(一),继续介绍Servlet 中Response 的使用。
Servlet 中Response 常见应用
- 验证码功能
- 验证码怎么来的
- 前端实现
- 后端实现,需要用到java 图片类,生产一个图片
- 验证码怎么来的
话不多说,直接上代码
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 如何是浏览器3 秒自动刷新一次
// 仔细想想,如何让后台去做,那肯定就是要响应回去
// 如何响应回去,那就是要用到Response 了
// 响应可以设置前端的所有东西
resp.setHeader("refresh", "3");
// 在内存中创建一个图片(java 中万物皆对象,图片也不例外)
BufferedImage image = new BufferedImage(40,40,BufferedImage.TYPE_INT_RGB);
// 得到一个图片
Graphics2D g = (Graphics2D) image.getGraphics(); // 对于这个对象,想象成一支笔
// 设置图片的背景颜色
g.setColor(Color.white);
g.fillRect(0,0,80,20); // 设置坐标
// 给图片写数据
g.setColor(Color.blue);
g.setFont(new Font(null, Font.ITALIC, 20));
g.drawString(makeNum(), 0, 20);
// 告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpeg");
// 网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires", -1);
// 设置缓存策略
resp.setHeader("Cache-Control", "no-cache");
resp.setHeader("Pragma", "no-cache");
// 把图片写给浏览器
ImageIO.write(image, "jpg", resp.getOutputStream());
}
// 验证码是随机的,生成随机数
private String makeNum() {
Random random = new Random();
String num = random.nextInt(9999999) + "";
StringBuffer sb = new StringBuffer();
// 遍历num,保证生成的数字一共7 位
for (int i = 0; i < 7 - num.length(); i++) {
sb.append(0);
}
String s = sb.toString() + num;
return s;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- Response 重定向
这个是最重要的。其他的应用场景可以忽略,因为实际开发中几乎不太会用到。
重定向:一个web 资源收到了客户端请求之后,它会通知客户端去访问另一个web 资源。这个过程叫做重定向。
上代码:
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 重定向。就这一行代码
resp.sendRedirect("/s1/image");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
我们分析一下原理,当访问/redirect 路径的时候,查看访问请求:
我们可以看到,有个302(重定向)的请求,会发现Response 里面有个Location:/s1/image。这就是重定向的最终结果。
重定向和转发的区别:
相同点:
- 页面都会跳转。
不同点:
- 请求转发的时候,url 不会产生变化。
- 重定向的时候,url 地址栏会发生变化。