JAVA生成一次性图片验证码

现在很多地方都需要写验证码登录验证,这样的好处是可以减轻服务器的压力等,下面就用java实现一次性登录验证码的书写。

1.验证码生成类:

package com.easyteam;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class ImageCode {
     int w=70;//宽度
     int h=35;//高度
     Random r=new Random();

    public  BufferedImage CreateImage(){//生成图片的方法
        BufferedImage img=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);//内存中创建一张图片
        Graphics gps=img.getGraphics();//获取当前图片的画笔

        gps.setColor(new Color(240,240,240));//设置画笔

        gps.fillRect(0, 0, w, h);//填充一个与图片一样大小的矩形(其实就是为了设置背景颜色)
        return img;

    }
    public   BufferedImage getImage(){//得到图片的方法
        BufferedImage img=CreateImage();
        Graphics gps=img.getGraphics();//获取当前图片的画笔
        //开始画东西
        for(int i=0;i<4;i++){
            String ch=this.getContent();
            gps.setColor(this.getColor());
            gps.setFont(this.getFont());
            gps.drawString(ch, w/4*i, h-5);//宽度让其不满图片
        }
        drawLine(img);
        return img;

    }
    public  void saveImage(BufferedImage img,OutputStream out) throws  IOException {
        //这里为了测试将生成的图片放入f盘,在实际的项目开发中是需要将生成的图片写入客户端的:ImageIO.write(img,"JPEG",response.getOutputStream());

        ImageIO.write(img, "JPEG", new FileOutputStream("F:\\a.jpg"));

    }
    //在图片中插入字母和十个数字
    String str="abcdefghijklmnupqrstuvwxyzABCDEFGHIJKLMNUPQRSTUVWZYZ1234567890";
    public   String getContent(){
        int index=r.nextInt(str.length());
        return str.charAt(index)+"";
    }
     String[] font={"宋体","华文楷体","华文隶书","黑体","华文新魏"};//字体
     int[] fontSize={24,25,26,27,28};//字号大小
     int[] fontStyle={0,1,2,3};//字体样式
    public   Font getFont(){
        int index1=r.nextInt(font.length);
        String name=font[index1];
        int style=r.nextInt(4);
        int index2=r.nextInt(fontSize.length);
        int size=fontSize[index2];
        return new Font(name,style,size);
    }
    public   Color getColor(){//得到不同的颜色
        int R=r.nextInt(256);//取值范围是0-255
        int G=r.nextInt(256);
        int B=r.nextInt(256);
        return new Color(R,G,B);
    }
    public void drawLine(BufferedImage img){//画干扰线
        Graphics2D gs=(Graphics2D) img.getGraphics();
        gs.setColor(Color.BLACK);
        gs.setStroke(new BasicStroke(1.5F));//设置线的宽度
        for(int i=0;i<5;i++){//横坐标不能超过宽度,纵坐标不能超过高度
            int x1=r.nextInt(w);
            int y1=r.nextInt(h);
            int x2=r.nextInt(w);
            int y2=r.nextInt(h);
            gs.drawLine(x1, y1, x2, y2);

        }
    }

}

2.测试类

package com.easyteam;

import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws  IOException {
        ImageCode imagecode=new ImageCode();
        BufferedImage img=imagecode.getImage();
        imagecode.saveImage(img, new FileOutputStream("F:\\a.jpg"));
    }

}

在实际的开发当中,还需要将图片上生成的文字保存下来,然后将其保存在Session对象中。将得到图片的代码进行改动

public   BufferedImage getImage(){//得到图片的方法
        BufferedImage img=CreateImage();
        Graphics gps=img.getGraphics();//获取当前图片的画笔
        StringBuilder sb=new StringBuilder();
        //开始画东西
        for(int i=0;i<4;i++){
            String ch=this.getContent();
            sb.append(ch);
            gps.setColor(this.getColor());
            gps.setFont(this.getFont());
            gps.drawString(ch, w/4*i, h-5);//宽度让其不满图片
        }
        //获取Session 对象,将sb保存
        drawLine(img);
        return img;

    }

附加:开发中可能生成的验证码看不清,需要换一张,但是有的浏览器有缓存,无法进行刷新,此时写一段JavaSctipt代码进行解决。

<script type="text/javascript">
     function fun(){
       1.通过id得到图片验证码
       2.将图片的连接后面加上new Date().gettime(); 这样每一次的链接就不同,就不会存在缓存的问题了。
     }
</script>
时间: 2024-08-02 03:32:00

JAVA生成一次性图片验证码的相关文章

java实现生成简单图片验证码

原文:java实现生成简单图片验证码 源代码下载地址:http://www.zuidaima.com/share/1550463428840448.htm 项目载图: 该项目要转换为Dynamic web project http://www.zuidaima.com/blog/1618162161323008.htm 另外缺少jar包: http://www.zuidaima.com/jar/search/jstl-1.0.1.htm http://www.zuidaima.com/jar/s

Java如何获取图片验证码保存

举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证码.由于是图片脚本selenium是无法识别的,这是时候我们解析图片验证码. 解决思路:1.通过selenium定位到图片,把图片保存到本地. 2 通过ORC技术将图片验证码转化为文字. 其他解决方法:A:去掉验证码    B:设置万能码 二.Web图片验证码的实现源码: 1 package uti

java web中图片验证码功能实现

用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

Flask 生成中文图片验证码

因最近要用到验证码,上网搜了下,发现什么验证码感觉都能被攻破,连最近疯传的变态的12306的验证码居然有人一天就攻破了,所以,综合考虑,还是使用汉字: web框架是Flask,然后使用python的Image库生成中文验证码,后续也可加入数字字母啥的. 代码如下: # -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') """ __author__="tina&qu

java中注册图片验证码

package org.servlet.demo; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.charset.Charset; import java.util.Random; im

随机生成文字图片验证码

1.随机生成汉字 //传入你要生成汉字的个数 public string GetGB2312String(int count) { var random = new Random(); var bs = new byte[count * 2]; for (var i = 0; i < count; i++) { var c = GetGB2312Char(random); bs[i * 2] = (byte)(c.X + 0xa0); bs[i * 2 + 1] = (byte)(c.Y + 0

利用Django生成动态图片验证码

首先,制作随机验证码需要引入随机模块,即random模块,并写出随机颜色函数,具体如下: import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) 之后我们引入Python的常用制图模块Pillow,pip install pillow一下,有些情况下某些模块下载后依然无法直接在项目中使用,此时我们需要前往setting

Django实现图片验证码

Django中图片验证码的实现 效果图: 实现思路: 注册页面提供验证码输入标签: <label>图形验证码:</label> <input type="text" name="pic_code" id="pic_code" v-model="image_code" @blur="check_image_code"> <img :src="image_co

java生成验证码图片

public class AuthImg extends HttpServlet { /** * */ private static final long serialVersionUID = 4975974534946437434L; // 设置图形验证码字符串的字体和大小 private Font mFont = new Font("微软雅黑", Font.ITALIC, 18); private Random random = new Random(); public void