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;
}
}