Java-Response实现下载文件和验证码

白衣少年
2022-11-07 / 0 评论 / 19 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年11月07日,已超过536天没有更新,若内容或图片失效,请留言反馈。

一、概述

在创建 servlet 时会覆盖 service() 方法,或 doGet()/doPost() ,这些方法都有两个参数,一个为代表请求的 request 和代表响应的 responseservice 方法中的 response 的类型是 ServletResponse ,而 doGet/doPost 方法的 response 的类型是 HttpServletResponseHttpServletResponseServletResponse的子接口,功能和方法更加强大。

二、流程

运行流程.png

三、HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表相应的一个HttpServletResponse:

  • 如果要获取请求的参数:HttpServletRequest
  • 如果要给客户端相应一些信息:HttpServletResponse

简单分类

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);//设置日期
void addDateHeader(String var1, long var2);//添加日期
void setHeader(String var1, String var2);//设置表头
void addHeader(String var1, String var2);//添加表头
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
void setStatus(int var1);//设置状态码
/*状态码不需要记忆,忘掉建议百度,常见的为404,500,200*/

常见应用

  1. 向浏览器输出东西
  2. 下载文件—-上传文件

    (1). 获取下载文件的路径
    (2). 获取下载的文件名
    (3). 设置浏览器,让它能够支持我们的下载
    (4). 获取下载文件的输入流
    (5). 创建缓冲区
    (6). 获取OutputStream对象
    (7). 将获取的文件流写入到buffer缓冲区
    (8). 使用OutputStream将缓冲区里面的文件刷入flush或close本地硬盘

public class FileServlet extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     String realPath = "E:\\ideaWorkplace\\com.yu\\response\\src\\main\\resources\\1.jpg";
     System.out.println("下载文件的路径:"+realPath);
     String fileName = realPath.substring(realPath.lastIndexOf("//")+1);
     resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName));
     FileInputStream in = new FileInputStream(realPath);
     int len=0;
     byte[] buffer = new byte[1024];
     ServletOutputStream out = resp.getOutputStream();
     while ((len=in.read(buffer))!=-1){
         out.write(buffer,0,len);
     }
     in.close();
     out.close();
 }
 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     doGet(req, resp);
 }
}

验证码生成

前端实现
后端实现,需要用到java的图片类,产生一个图片

 public class ImageServlet extends HttpServlet {
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         //如何让浏览器5秒刷新一次?
         resp.setHeader("refresh","3");
         //在内存中创建图片
         BufferedImage image = new BufferedImage(200,200,BufferedImage.TYPE_INT_RGB);
         //开始画图
         Graphics2D g=(Graphics2D) image.getGraphics();
         //设置图片背景颜色
         g.setBackground(Color.white);
         g.fillRect(0,0,100,50);
         //写入验证码
         g.setColor(Color.GREEN);
         g.setFont(new Font(null,Font.ROMAN_BASELINE,20));
         g.drawString(makeNumber(),0,25);
         //高速浏览器,这个请求用图片的方式打开
         resp.setContentType("image/png");
         //设置不让浏览器缓存图片
         resp.setDateHeader("expires",-1);
         resp.setHeader("Cache-Control","no-cache");
         resp.setHeader("Program","no-cache");
         //把图片写给浏览器
         boolean write = ImageIO.write(image,"png", resp.getOutputStream());
     }
     //生成随机数
     private String makeNumber(){
         Random r = new Random();
         String num=r.nextInt(99999999)+"";
         StringBuffer sBuffer = new StringBuffer();
         for (int i = 0; i < 8-num.length(); i++) {
             sBuffer.append("x");
         }
         return sBuffer.toString()+num;
     }
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
     }
 }

## 好了本篇文章就到这里啦,剩下的便是自行参悟喽 表情

3

打赏

评论 (0)

OwO
取消