HttpServletResponse实战之下载文件与动态验证码Javaweb

Posted 上进小菜猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpServletResponse实战之下载文件与动态验证码Javaweb相关的知识,希望对你有一定的参考价值。

@[toc]

一.前言

web服务器从客户端接收HTTP请求,并创建表示该请求的HttpServletRequest对象和表示该请求响应的HTTP ServletResponse。

HttpServletReques:获取客户端请求过来的参数。

HttpServletResponse:给客户端响应一些信息。

二.HttpServletResponse

负责给浏览器发送数据:

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

2.1实战之下载文件

2.1.1 准备

1.新建一个新的Maven工程项目,工程名起为:Response,模板类型选择webapp。如下图

2.创建项目文件Java,设置其类型为root。如下图

3.找到webapp文件夹下的WEB-INF的web.xml,更改引用源:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

4.新建接口,名为:com.gowork.servlet,遵循阿里巴巴变量名规则。

5.建立类,类名为Fileservlet。

6.继承类HttpServlet,重写doGet和doPost

7.找一个目标文件

8.Fileservlet里的重写doGet详情如下:

1.先获取下载文件的路径如下

String realpath = this.getServletContext().getRealPath("/zhu.png");
System.out.println("要下载的文件路径为:"+realpath);

2.获取到下载的文件名

String filename= realpath.substring(realpath.lastIndexOf("\\\\")+1);

3.设置想办法让浏览器能够支持下载我们需要的东西

resp.setHeader("Content-disposition","attachment;filename="+filename);

4.获取下载文件的输入流

FileInputStream fileInputStream = new FileInputStream(realpath);

5.创建缓冲区

int length = 0;
byte[] buffer = new byte[1024];

6.获取OutputStream:对象

ServletOutputStream outputStream = resp.getOutputStream();

7.将FileOutputStreami流写入到ouffer缓冲区

while ((length = fileInputStream.read(buffer)) > 0) 
    outputStream.write(buffer, 0, length);

8.使用OutputStream将缓冲区中的数据输出到客户端!

fileInputStream.close();
outputStream.close();

9.注册下载文件的url和对应的映射。

<servlet>
    <servlet-name>down</servlet-name>
    <servlet-class>com.gowork.servlet.Fileservlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>down</servlet-name>
    <url-pattern>/down</url-pattern>
</servlet-mapping>

配置tomcat,更改tomcat的路径信息,对应我们的webapp,注意端口号。

我们获取到图片的绝对位置:

C:\\\\Users\\\\24190\\\\IdeaProjects\\\\xiao\\\\Response\\\\target\\\\classes\\\\zhu.jpg

将path更改为:

String realpath = "C:\\\\Users\\\\24190\\\\IdeaProjects\\\\xiao\\\\Response\\\\target\\\\classes\\\\zhu.jpg";

然后运行服务器,访问/down的url,查看结果:

访问:http://localhost:8080/Response/down

会进行自动下载该图片。

本次实战之下载文件成功实现,本块结束。

2.2 实战之验证码

1.新建一个类,类名为imgservlet。

2.继承extends HttpServlet ,重写doGet和dopost。

3.让浏览器3秒刷新一次。

resp.setHeader( "refresh","3" );

4.在内存创建一个图片。

BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);

5.得到图片,相当于用画笔画。

Graphics2D g = (Graphics2D) image.getGraphics();

6.设置图片背景颜色

g.setColor( Color.WHITE );
g.fillRect(0,0,80,80  );

7.给图片写数据,对其进行绘图操作。

g.setColor( Color.BLUE );
g.setFont( new Font( null,Font.BOLD,20 ) );
g.drawString( mackNum(),0,20 );

8.告诉浏览器,这个请求用图片的方式打开。

resp.setContentType( "image/jpg" );

9.网站存在缓存,不让浏览器缓存。

resp.setDateHeader( "expires",-1 );
resp.setHeader( "Cache-Control" ,"no-cache");
resp.setHeader( "Pragma","no-cache" );

10.把图片写给浏览器。

boolean write = ImageIO.write( image,"jpg", resp.getOutputStream( ) );

11.写一段生成随机数的函数:

public String mackNum()
    Random random = new Random();
    String num = random.nextInt( 9999999 )+"";
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 7-num.length(); i++) 
        sb.append( "0" );
    
    num = sb.toString() + num;
    return num;

12.对img路径进行注册和映射。

<servlet>
    <servlet-name>Imageservlet</servlet-name>
    <servlet-class>com.gowork.servlet.imgservlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Imageservlet</servlet-name>
    <url-pattern>/img</url-pattern>
</servlet-mapping>

2.2.1 效果演示

访问路径:

3秒后:

每3秒随机一个7位的验证码。

验证码功能完成。

以上是关于HttpServletResponse实战之下载文件与动态验证码Javaweb的主要内容,如果未能解决你的问题,请参考以下文章

在 Tensorflow 中加载文本分类模型时出现 ValueError

mega同时下载文件数

在 Shiny 中下载文本并生成 txt 文件

C++字符串数组,从文件中加载文本行

Msql入门实战之下

在 WKWebView swift 中下载文档并加载图像(png、jpeg)、pdf、doc 等