IDEA java生成随机验证码(简)

package cn.edu.muj.project_2.controller;

import javax.imageio.ImageIO;
import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.lang.reflect.Array;
import java.rmi.server.ExportException;
import java.util.Arrays;
import java.util.Random;
import java.awt.Color;

@WebServlet(“captcha”)
public class CaptcheController extends HttpServlet {
private static Random random = new Random();
private final int WIDTH = 200;
private final int HEIGHT = 80;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BufferedImage img = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_BGR);
Graphics2D g = img.createGraphics();

    //设置颜色
    Color[] cp = new Color[]{Color.GRAY,Color.cyan,Color.black,Color.ORANGE,Color.PINK,Color.RED,Color.GREEN,Color.YELLOW};

    g.setColor(Color.gray);// 设置边框色

    Color c = getRandColor(200, 250);
    g.setColor(c.white);// 设置背景色
    g.fillRect(0, 0, WIDTH,HEIGHT);//指定区域设置颜色

    //设置干扰线
    Random r2 = new Random();
    g.setColor(getRandColor(160,200));//设置线条颜色
    for (int i=0;i<20;i++){
        int x = r2.nextInt(WIDTH-20);
        int y = r2.nextInt(HEIGHT-10);
        int xl = r2.nextInt(12);
        int yl = r2.nextInt(20);
        g.drawLine(x,y,x+xl+30,y+yl+20);
    }

    //设置噪点
    float zd = 0.1f;//噪点率
    int area = (int)(zd*WIDTH*HEIGHT);
    for (int i=0;i<area;i++){
        int x = r2.nextInt(WIDTH);
        int y = r2.nextInt(HEIGHT);
        int rgb = getRandomIntColor();
        img.setRGB(x,y,rgb);
    }

    String code = randomString(4);

    int fontSize = HEIGHT - 4;
    Font font = new Font("宋体", Font.ITALIC, fontSize);
    g.setFont(font);

    char[] chars = code.toCharArray();

    //扭转验证码
    for (int i = 0; i < code.length(); i++) {
        AffineTransform affine = new AffineTransform();//仿射变形
        //设置平移的旋转变换
        affine.setToRotation(Math.PI / 4 * r2.nextDouble() * (r2.nextBoolean() ? 1 : -1), (WIDTH / code.length()) * i + fontSize / 2, HEIGHT / 2);
        g.setTransform(affine);
        //绘写
        g.drawChars(chars, i, 1, ((WIDTH - 10) / code.length()) * i + 5, HEIGHT / 2 + fontSize / 2 - 10);
    }

    g.dispose();

    ServletOutputStream out = resp.getOutputStream();
    ImageIO.write(img, "JPEG", out);
    try{
        out.close();
    }catch (Exception ex){}
    finally {
        out.close();
    }
}

private  String randomString(int count){
    StringBuilder bu = new StringBuilder();
    String source ="abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXYZ0123456789";
    Random r = new Random();
    for (int i=0;i<count;i++){
        int pos = r.nextInt(source.length());
        String s = source.substring(pos,pos+1);
        bu.append(s);
    }
    return bu.toString();
}

private static 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);
}

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];
    for (int i = 0; i < 3; i++) {
        rgb[i] = random.nextInt(255);
    }
    return rgb;
}

}在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值