前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java-Response实现下载文件和验证码

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

作者头像
白衣少年
发布2022-12-26 13:36:48
3850
发布2022-12-26 13:36:48
举报

一、概述

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

二、流程

运行流程.png
运行流程.png

三、HttpServletResponse

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

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

简单分类

负责向浏览器发送数据的方法

代码语言:javascript
复制
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

代码语言:javascript
复制
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*/

常见应用

向浏览器输出东西

下载文件—-上传文件

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

代码(仅供参考)

代码语言:javascript
复制
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);
 }
}

验证码生成

如何实现验证?

代码语言:javascript
复制
前端实现
后端实现,需要用到java的图片类,产生一个图片

代码实现(只要前面的maven配置没有问题,跟着老师走就行,没啥好说的)

代码语言:javascript
复制
 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);
     }
 }

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
  • 二、流程
  • 三、HttpServletResponse
    • 简单分类
      • 常见应用
        • 验证码生成
        相关产品与服务
        验证码
        腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档