使用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(200250));
48         g.fillRect(00, i_width, i_height);
49         
50         g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
51         
52         g.setColor(getRandColor(160200));
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+616);
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 
复制代码
posted @   诚实小郎君  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示