Servlet 中Response 的使用(二)

96 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

本片文章承接上一篇:Servlet 中Response 的使用(一),继续介绍Servlet 中Response 的使用。

Servlet 中Response 常见应用

  1. 验证码功能
    1. 验证码怎么来的
      1. 前端实现
      2. 后端实现,需要用到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);
    }

}
  1. 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 路径的时候,查看访问请求:

image.png 我们可以看到,有个302(重定向)的请求,会发现Response 里面有个Location:/s1/image。这就是重定向的最终结果。

重定向和转发的区别:

相同点:

  1. 页面都会跳转。

不同点:

  1. 请求转发的时候,url 不会产生变化。
  2. 重定向的时候,url 地址栏会发生变化。