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的主要内容,如果未能解决你的问题,请参考以下文章