验证码以及下载文件案例

本文介绍了如何在Java中实现验证码的生成与展示,包括设置图片尺寸、绘制干扰线和文字,以及处理点击刷新验证码的逻辑。同时,还详细讲解了文件下载的过程,包括获取文件名、设置响应头以解决中文文件名问题,并通过输出流将文件内容发送给客户端。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.验证码:

步骤:

html:

1.当页面加载时,开始方法

2.给图片设置点击事件

3.给连接设置点击事件

Servlet:

1.创建img输出对象,在内存中的图片(验证码图片对象)

2.美化图片

3.将图片输出到页面展示

代码展示:

Servlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建img输出对象,在内存中的图片(验证码图片对象)
        //设置高度
        int width = 100;
        //设置宽度
        int height = 50;
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //2.美化图片
        //获取画笔对象
        Graphics draw = image.getGraphics();
        //设置画笔颜色
        draw.setColor(Color.BLUE);
        //填充背景颜色
        draw.fillRect(0,0,width,height);
        //设置画笔颜色
        draw.setColor(Color.RED);
        //设置边框颜色
        draw.drawRect(0,0,width-1,height-1);
        //编写验证码
        //1.定义一个自负串包括A-Z,a-z,0-9
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        //创建随机对象
        Random ran = new Random();
        for (int x = 0 ; x < 4 ; x++){
            //生成随机角标
            int index = ran.nextInt(str.length());
            //通过随机角标获得字符
            char ch = str.charAt(index);
            //写验证码
            draw.drawString(ch+"",width/5*x,height/2);
        }
        //画干扰线
        for (int x = 0 ; x<10 ; x++){
            int x1 = ran.nextInt(width);
            int y1 = ran.nextInt(height);
            int x2 = ran.nextInt(width);
            int y2 = ran.nextInt(height);
            draw.drawLine(x1,y1,x2,y2);
        }
        //3.将图片输出到页面展示
        ImageIO.write(image,"jpg",response.getOutputStream());
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        window.onload = function () {
           var img = document.getElementById("checkCode");
           img.onclick = function () {
               var date =new Date().getTime();
               img.src = "/javaEETomcat/CodeServlet?"+date;
           }
           var change = document.getElementById("change");
            change.onclick = function () {
                var date = new Date().getTime();
                img.src = "/javaEETomcat/CodeServlet?"+date;
            }
        }
    </script>
</head>
<body>
<img id="checkCode" src="/javaEETomcat/CodeServlet" >
<a id="change" href="">看不起,点击切换</a>
</body>
</html>

2.文件下载

步骤:

1.定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

2.定义Servlet

2.1获取文件名称

2.2使用字节输出流加载文件进内存

2.3指定response的响应头:content-disposition:attachment;filename=xxx

2.4将数据写到response输出流

问题:

文件中文问题解决思路:

1.获取客户端使用的浏览器版本消息

2.根据不同的版本消息,设置filename编码方式不同

代码实现:

Servlet:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*获取文件名称*/
        String filename = request.getParameter("filename");
        /*使用字节输入流加载文件进内存*/
        //获取ServletContext对象,也就是获取整个web
        ServletContext context = this.getServletContext();
        //根据获取到的文件名称找到文件的真实路径
        String realPath = context.getRealPath("/img/" + filename);
        System.out.println(realPath);
        //用字节流保存文件
        FileInputStream fi = new FileInputStream(realPath);
        /*设置响应头*/
        //获取ServletContext对象的MIME类型
        String mimeType = context.getMimeType(filename);
        //通过获取到的MIME类型,设置响应头类型:content-type
        response.setHeader("content-type",mimeType);

        /*解决中文文件名编码问题*/
        //获取user-agent请求头
        String agent = request.getHeader("user-agent");
        //使用工具类方法编码文件名即可
        filename = DownLoadUtils.getFileName(agent,filename);

        //设置响应头打开方式:content-disposition:"attachment;attachment是用浮窗口展示
        // filename"+filename(动态获取对应的文件名称)
        response.setHeader("content-disposition","attachment;filename"+filename);
        /*将输入流的数据写出到输出流中*/
        //获取文件输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //自定义字节数组用来把文件保存为字节格式
        byte[] buff = new byte[1024*8];
        //字节数组长度
        int len = 0;
        //使用循环输出流
        while ((len = fi.read(buff)) != -1){
            //输出从0到len的长度
            outputStream.write(buff,0,len);
        }
        //关闭资源输入流
        fi.close();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载</title>
</head>
<body>
<!--1.jpg或者时1.avi都是要下载的文件,Servlet通过该filename的值去服务器中获取该文件-->
<a href="/javaEETomcat/DownServlet?filename=1.jpg">图片</a>
<a href="/javaEETomcat/DownServlet?filename=1.avi">视频</a>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值