使用Servlet生成图形验证码
1 package cn.eshopping.util;
2
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.Graphics;
6 import java.awt.image.BufferedImage;
7 import java.io.IOException;
8 import java.util.Random;
9
10 import javax.imageio.ImageIO;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 /**
17 * 用于生成图形验证码的Servlet
18 * 基本思路是先随即产生几个数字,然后在内存中画出来,再加上一些扰乱线,有的甚至还加入了变形,
19 * 然后输出到页面。在产生随即数的同时,还将这个随机数字保存到session,以供后面判断
20 */
21 public class AuthCode extends HttpServlet {
22
23
24
25 @Override
26 public void init() throws ServletException {
27 // TODO Auto-generated method stub
28 super.init();
29 }
30
31 @Override
32 protected void service(HttpServletRequest request, HttpServletResponse response)
33 throws ServletException, IOException {
34 //设置响应消息头
35 response.setHeader("Pragma", "No-cache");
36 response.setHeader("Cache-Control", "no-cache");
37 response.setHeader("Expires", "0");
38
39 int i_width = 60;
40 int i_height = 20;
41 BufferedImage image = new BufferedImage(i_width, i_height, BufferedImage.TYPE_INT_BGR);
42
43 Graphics g = image.getGraphics();
44
45 Random random = new Random();
46
47 g.setColor(getRandColor(200, 250));
48 g.fillRect(0, 0, i_width, i_height);
49
50 g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
51
52 g.setColor(getRandColor(160, 200));
53
54 for(int i = 0 ; i < 155; i++) {
55 int i_x = random.nextInt(i_width);
56 int i_y = random.nextInt(i_height);
57 int i_x1 = random.nextInt(12);
58 int i_y1 = random.nextInt(12);
59 g.drawLine(i_x, i_y, i_x1, i_y1);
60 }
61
62 String authCode = "";
63 for(int i = 0 ; i < 4 ; i++) {
64 String randChar = String.valueOf(random.nextInt(10));
65 authCode += randChar;
66
67 g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
68 g.drawString(randChar, 13*i+6, 16);
69 }
70
71 request.getSession().setAttribute("authCode", authCode);
72
73 System.out.println("验证码是" + authCode);
74
75 g.dispose();
76
77 ImageIO.write(image, "JPEG", response.getOutputStream());
78 }
79
80 /**
81 * 随机获取颜色
82 * @param fc
83 * @param bc
84 * @return
85 */
86 private Color getRandColor(int fc, int bc) {
87 Random random = new Random();
88 if(fc > 255) fc = 255;
89 if(bc > 255) bc = 255;
90 int r = fc + random.nextInt(bc - fc);
91 int g = fc + random.nextInt(bc - fc);
92 int b = fc + random.nextInt(bc - fc);
93 return new Color(r,g,b);
94 }
95
96 }
97
2
3 import java.awt.Color;
4 import java.awt.Font;
5 import java.awt.Graphics;
6 import java.awt.image.BufferedImage;
7 import java.io.IOException;
8 import java.util.Random;
9
10 import javax.imageio.ImageIO;
11 import javax.servlet.ServletException;
12 import javax.servlet.http.HttpServlet;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
16 /**
17 * 用于生成图形验证码的Servlet
18 * 基本思路是先随即产生几个数字,然后在内存中画出来,再加上一些扰乱线,有的甚至还加入了变形,
19 * 然后输出到页面。在产生随即数的同时,还将这个随机数字保存到session,以供后面判断
20 */
21 public class AuthCode extends HttpServlet {
22
23
24
25 @Override
26 public void init() throws ServletException {
27 // TODO Auto-generated method stub
28 super.init();
29 }
30
31 @Override
32 protected void service(HttpServletRequest request, HttpServletResponse response)
33 throws ServletException, IOException {
34 //设置响应消息头
35 response.setHeader("Pragma", "No-cache");
36 response.setHeader("Cache-Control", "no-cache");
37 response.setHeader("Expires", "0");
38
39 int i_width = 60;
40 int i_height = 20;
41 BufferedImage image = new BufferedImage(i_width, i_height, BufferedImage.TYPE_INT_BGR);
42
43 Graphics g = image.getGraphics();
44
45 Random random = new Random();
46
47 g.setColor(getRandColor(200, 250));
48 g.fillRect(0, 0, i_width, i_height);
49
50 g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
51
52 g.setColor(getRandColor(160, 200));
53
54 for(int i = 0 ; i < 155; i++) {
55 int i_x = random.nextInt(i_width);
56 int i_y = random.nextInt(i_height);
57 int i_x1 = random.nextInt(12);
58 int i_y1 = random.nextInt(12);
59 g.drawLine(i_x, i_y, i_x1, i_y1);
60 }
61
62 String authCode = "";
63 for(int i = 0 ; i < 4 ; i++) {
64 String randChar = String.valueOf(random.nextInt(10));
65 authCode += randChar;
66
67 g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110)));
68 g.drawString(randChar, 13*i+6, 16);
69 }
70
71 request.getSession().setAttribute("authCode", authCode);
72
73 System.out.println("验证码是" + authCode);
74
75 g.dispose();
76
77 ImageIO.write(image, "JPEG", response.getOutputStream());
78 }
79
80 /**
81 * 随机获取颜色
82 * @param fc
83 * @param bc
84 * @return
85 */
86 private Color getRandColor(int fc, int bc) {
87 Random random = new Random();
88 if(fc > 255) fc = 255;
89 if(bc > 255) bc = 255;
90 int r = fc + random.nextInt(bc - fc);
91 int g = fc + random.nextInt(bc - fc);
92 int b = fc + random.nextInt(bc - fc);
93 return new Color(r,g,b);
94 }
95
96 }
97
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架