1.新建web项目
2.在包中新建servlet文件
代码如下:
package verification.code;
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.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Response生成验证码
* @author
*
*/
public class ImageCode extends HttpServlet {
private static final long serialVersionUID = 1L;
//设置图片的宽高
private static final int WIDTH = 120;
private static final int HEIGHT = 40;
//设置字符,数字,排除有歧义的字母或数字
private char[] chars = "abcdefghijkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ2345678".toCharArray();
//创建一个随机对象
Random random = new Random();
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置不缓存图片
response.setHeader("Pargma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
//表面响应的是图片格式
response.setContentType("image/jpeg");
//创建一个图片数据缓存区对象BufferedImage,相当于一个图片对象
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中,相当于一支画笔
Graphics2D g = image.createGraphics();
//设置背景色
setBackGround(g);
//画边框
drawBorder(g);
//画干扰线
drawRandomLine(g);
//画干扰雪花
drawRandomSnow(g);
//画随机生成字符串
String code = drawRandomCode(g);
//将产生的字符串放入session以备验证时使用
HttpSession session = request.getSession();
session.setAttribute("code", code);
// String codei = (String) session.getAttribute("code");
// System.out.println(codei);
//释放图形资源
g.dispose();
//把图片写给浏览器显示
ImageIO.write(image, "jpg", response.getOutputStream());
}
//定义一个获取随机颜色的方法
private Color setRandomColor(int start, int end) {
int r, g, b;
if (start > 255)
start = 255;
if (end > 255)
end = 255;
r = start + random.nextInt(end - start);
g = start + random.nextInt(end - start);
b = start + random.nextInt(end - start);
return new Color(r, g, b);
}
//设置背景色
private void setBackGround(Graphics2D g) {
g.setColor(setRandomColor(157, 255));
//填充矩形
g.fillRect(0, 0, WIDTH, HEIGHT);
}
//画边框
private void drawBorder(Graphics2D g) {
//设置边框颜色
g.setColor(setRandomColor(0, 156));
//画边框
g.drawRect(1, 1, WIDTH-3, HEIGHT-3);
}
//画干扰线
private void drawRandomLine(Graphics2D g) {
//画6条干扰线
for (int i = 0; i < 6; i++) {
g.setColor(setRandomColor(0,156));
int x1 = random.nextInt(100) + 10;
int y1 = random.nextInt(30) + 5;
int x2 = random.nextInt(100) + 10;
int y2 = random.nextInt(30) + 5;
g.drawLine(x1, y1, x2, y2);
}
}
//画干扰雪花
private void drawRandomSnow(Graphics2D g) {
//画50个雪花
for (int i = 0; i < 50; i++) {
g.setColor(setRandomColor(157, 255));
int x = random.nextInt(100) + 10;
int y = random.nextInt(30) + 10;
g.drawString("*", x, y);
}
}
//画随机生成字符串
private String drawRandomCode(Graphics2D g) {
//生成四位字符串
int x = WIDTH/4;//为后面隔开字符串距离
int index;
StringBuffer s = new StringBuffer();
for (int i = 0; i < 4; i++) {
index = random.nextInt(chars.length);
g.setColor(setRandomColor(0, 156));
//设置字体格式和大小
g.setFont(new Font("黑体", Font.BOLD, 25));
//设置一个随机角度
double angle = (random.nextInt()%30)*Math.PI/180;
//旋转
g.rotate(angle, (i*x)+8, random.nextInt(10)+25);
g.drawString(chars[index]+"", (i*x)+8, random.nextInt(10)+25);
g.rotate(-angle, (i*x)+8, random.nextInt(10)+25);
s.append(chars[index]);
}
return s.toString();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3.web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>test</display-name>
<servlet>
<servlet-name>ImageCode</servlet-name>
<servlet-class>verification.code.ImageCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageCode</servlet-name>
<url-pattern>/ImageCode</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
4.执行结果截图
浏览器执行结果:
控制台获取字符串: