java创建图片验证码

package com;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class ImgServlet extends HttpServlet {

/**
  *
  */
 private static final long serialVersionUID = 1L;

private static Random random = new Random();
 private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色
     if(fc > 255)
         fc=255;
     if(bc > 255)
         bc=255;
     int r=fc + random.nextInt(bc - fc);
     int g=fc + random.nextInt(bc - fc);
     int b=fc + random.nextInt(bc - fc);
     return new Color(r, g, b);
 }

public void goRegister(HttpServletRequest request, HttpServletResponse response) {
        // 设置页面不缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);

// 在内存中创建图象
        int width=100, height=40; // 图象大小
        BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文
        Graphics2D g=image.createGraphics();
        g.setColor(new Color(255, 255, 255)); // 设定背景色
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman", Font.BOLD, 30)); // 设定字体
        Color c = getRandColor(160, 200);
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(c);
        for(int i=0; i < 155; i++) {
            int x=random.nextInt(width);
            int y=random.nextInt(height);
            int xl=random.nextInt(12);
            int yl=random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
        // 添加噪点 
        float yawpRate = 0.05f;// 噪声率 
        int area = (int) (yawpRate * width * height); 
        for (int i = 0; i < area; i++) { 
            int x = random.nextInt(width); 
            int y = random.nextInt(height); 
            int rgb = getRandomIntColor(); 
            image.setRGB(x, y, rgb); 
        } 
      //随机生成不同的字体、字体样式和字体大小
        String[] fontName = {"微软雅黑","黑体","Georgia","Verdana","Arial","Comic Sans MS","Lucida Console"};
        int [] fontEffect = {Font.PLAIN, Font.ITALIC, Font.BOLD};
        int [] fontSize = {28, 30, 32, 26};
        Font[] fonts = new Font[fontName.length*fontEffect.length*fontSize.length];
        int fontsIndex=0;
        for(String str: fontName){
            for(int effect: fontEffect){
                for(int size : fontSize){
                    Font font = new Font(str, effect, size);
                    fonts[fontsIndex]=font;
                    fontsIndex = fontsIndex +1;
                }
            }
        }
        String s="abcdefghijknpqrstuvxyzABCDEFGHJKLNPQRSTUVXYZ23456789"; // 设置备选验证码
        String sRand="";
              // 用随机产生的颜色将验证码绘制到图像中。
        int length = 4;  // 设置默认生成4个验证码
        for(int i=0;i<length;i++){
        g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110))); // 生成随机颜色(因为是做前景,所以偏深)
            g.setFont(fonts[random.nextInt(fonts.length)]);  //调用上方的随机字体
         String ch=String.valueOf(s.charAt(random.nextInt(s.length())));

//设置字体旋转
         int zhuan = random.nextInt(20);
         int fzhuan = -random.nextInt(20);
            g.rotate(Math.toRadians(zhuan),25*(i-1),20);     /// 坐标系顺时针转
            g.rotate(Math.toRadians(fzhuan),25*(i-1),20);    /// 坐标系逆时针转
       
            sRand+=ch;
           g.drawString(ch, 18 * i + 15, 30); //将认证码用 drawString 函数显示到图象里

g.rotate(Math.toRadians(-1*zhuan),25*(i-1),20);
         g.rotate(Math.toRadians(-1*fzhuan),25*(i-1),20);
        }
        //在认证码的上端画一条不规则的线
        int visit[] = new int[6]; 
        for (int i = 0; i < visit.length; i++) { 
            visit[i] = 1 + (int) (Math.random() * 10); 
        }
        g.setColor(Color.BLACK); 
        int drawHigh[] = new int[6]; 
        int drawwidth[] = new int[6]; 
        //折点坐标 
        for (int i = 0; i < 6; i++) { 
           drawHigh[i] = 40 - (int) (Math.ceil(visit[i] * 3.8)); 
           drawwidth[i] = 5 + i * 17; 
        } 
        g.setStroke(new BasicStroke(3.0f));  //折线粗细
        g.setPaint(Color.gray);//折线的颜色
        g.drawPolyline(drawwidth, drawHigh, 6);  //画折线
        // 将认证码存入Session
        HttpSession session = request.getSession(true);
        String time=String.valueOf(System.currentTimeMillis());
        String value=time + "_" + sRand;
        session.setAttribute("", time);
        session.setAttribute("",value);

// 图象生效
        g.dispose();
        try {
            ImageIO.write(image, "JPEG", response.getOutputStream()); // 输出图象到页面
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
    private static int getRandomIntColor() { 
        int[] rgb = getRandomRgb(); 
        int color = 0; 
        for (int c : rgb) { 
            color = color << 8; 
            color = color | c; 
        } 
        return color; 
    } 
    private static int[] getRandomRgb() { 
        int[] rgb = new int[3];
        Random random = new Random();
        for (int i = 0; i < 3; i++) { 
            rgb[i] = random.nextInt(255); 
        } 
        return rgb; 
    } 
}

时间: 2024-10-19 11:12:48

java创建图片验证码的相关文章

java实现图片验证码登陆

java实现图片验证码登陆 话不多说 直接上图 ↓↓↓↓↓↓↓↓↓↓ 成果图 ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓↓ 差不多这就是演示图啦 如需源码请联系QQ:11234013 可手把手讲解知识点 原文地址:https://www.cnblogs.com/zhetiankj/p/12641439.html

java实现图片验证码

一.验证码生成类 1 package hbi.tech.utils; 2 import javax.imageio.ImageIO; 3 import java.awt.*; 4 import java.awt.image.BufferedImage; 5 import java.io.ByteArrayInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.io.Ou

Java创建图片文件缩略图

public static void uploadImg(InputStream file, String filePath, String fileName, int widthdist, int heightdist) throws Exception { File targetDir = new File(filePath + FS_FILE_APP_PATH); if (!targetDir.exists()) { targetDir.mkdirs(); } // 开始读取文件并进行压缩

自己写一个图片验证码程序

本程序基于struts2,用action响应请求. 一.首先,创建一个用于产生随即验证码图片的类ImageCode.java. 1 package com.exp.image; 2 3 import java.awt.BasicStroke; 4 import java.awt.Color; 5 import java.awt.Font; 6 import java.awt.Graphics; 7 import java.awt.Graphics2D; 8 import java.awt.Ren

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

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.BufferedI

Java Web:使用Servlet生成网页随机图片验证码

最近在学习Java Web开发,做了一个生成网页随机图片验证码的例子,在此记录. 一.新建Servlet项目: 在MyEclipse中新建Servlet项目,一步步操作就OK,在此不再赘述.建好之后文件目录树如下图: 二.源代码实现: (1)java代码: package com.zdt.identity; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.

怎样用Java自制优秀的图片验证码?这样!

Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试 简称CAPTCHA,这就是验证码的含义.它可以防止恶意破解密码.刷票.论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试等. 虽然网上有一些很不错的验证码开源插件如kaptcha等,但是如果自己能够熟悉原理并且自己动手写,那岂不是一件很酷的事情么?今天给大家分享的这个教程是基于J

工作笔记5.JAVA图片验证码

本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServlet,实现载入验证码的功能. 4.取出存放在Session中的验证码.在Action中推断验证码的正确性 相比較上一篇博客<工作笔记5.JAVA文本框验证码>而言,图片验证码添加了安全性. 在Action中,通过取出Session中的验证码与输入的验证码是否匹配进行推断. 步骤: 1.拷贝Auth