使用jsp生成彩色汉字验证码

本文介绍了一种使用JSP生成包含随机汉字的验证码图片的方法。通过Java代码实现随机颜色选择、字体样式变化及背景噪声添加等功能,提高了验证码的安全性和防破解能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<% @ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<% @ page contentType="image/jpeg"
    import
="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"
%>
 
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
    
< head >
         

        
< title > My JSP 'index.jsp' starting page </ title >
        
< meta  http-equiv ="pragma"  content ="no-cache" >
        
< meta  http-equiv ="cache-control"  content ="no-cache" >
        
< meta  http-equiv ="expires"  content ="0" >
        
< meta  http-equiv ="keywords"  content ="keyword1,keyword2,keyword3" >
        
< meta  http-equiv ="description"  content ="This is my page" >
 
    
</ head >

    
< body >
        
<% !//生成随机颜色 
    Color getRandColor(Random random, 
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);
    }
%>
        
<%
            
//设置页面不缓存 
            response.setHeader(
"Pragma""No-cache");
            response.setHeader(
"Cache-Control""no-cache");
            response.setDateHeader(
"Expires"0);

            
// 设置图片的长宽 
            
int width = 176, height = 30;
            
//设置备选汉字,剔除一些不雅的汉字 
            
String base = "的一了是我不在人们有来他这上着个地到大里说就去子得也和那要下看天时过出小么起你都把好还多没为又可家学只以主会样年想生同老中十从自面前头道它后然走很像见两用她国动进成回什边作对开而己些现山民候经发工向事命给长水几义三声于高手知理眼志点心战二问但身方实吃做叫当住听革打呢真全才四已所敌之最光产情路分总条白话东席次亲如被花口放儿常气五第使写军吧文运再果怎定许快明行因别飞外树物活部门无往船望新带队先力完却站代员机更九您每风级跟笑啊孩万少直意夜比阶连车重便斗马哪化太指变社似士者干石满日决百原拿群究各六本思解立河村八难早论吗根共让相研今其书坐接应关信觉步反处记将千找争领或师结块跑谁草越字加脚紧爱等习阵怕月青半火法题建赶位唱海七女任件感准张团屋离色脸片科倒睛利世刚且由送切星导晚表够整认响雪流未场该并底深刻平伟忙提确近亮轻讲农古黑告界拉名呀土清阳照办史改历转画造嘴此治北必服雨穿内识验传业菜爬睡兴形量咱观苦体众通冲合破友度术饭公旁房极南枪读沙岁线野坚空收算至政城劳落钱特围弟胜教热展包歌类渐强数乡呼性音答哥际旧神座章帮啦受系令跳非何牛取入岸敢掉忽种装顶急林停息句区衣般报叶压慢叔背细";
            
//备选汉字的长度 
            
int length = base.length();

            
//创建内存图像 
            BufferedImage image 
= new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
            
// 获取图形上下文 
            Graphics g 
= image.getGraphics();

            
//创建随机类的实例 
            Random random 
= new Random();

            
// 设定图像背景色(因为是做背景,所以偏淡) 
            g.setColor(getRandColor(random, 
200250));
            g.fillRect(
00, width, height);

            
//备选字体 
            
String[] fontTypes = { "宋体""新宋体",
                    
"黑体""楷体""隶书" };
            
int fontTypesLength = fontTypes.length;

            
//在图片背景上增加噪点 
            g.setColor(getRandColor(random, 
160200));
            g.setFont(
new Font("Times New Roman", Font.PLAIN, 14));
            
for (int i = 0; i < 6; i++) {
                g.drawString(
"*********************************************",
                        
05 * (i + 2));
            }

            
//取随机产生的认证码(6个汉字) 

            
//保存生成的汉字字符串 
            
String sRand = "";
            
for (int i = 0; i < 6; i++) {
                
int start = random.nextInt(length);
                
String rand = base.substring(start, start + 1);
                sRand 
+= rand;

                
//设置字体的颜色 
                g.setColor(getRandColor(random, 
10150));
                
//设置字体 
                g.setFont(
new Font(fontTypes[random.nextInt(fontTypesLength)],
                        Font.BOLD, 
18 + random.nextInt(6)));
                
//将此汉字画到图片上 
                g.drawString(rand, 
24 * i + 10 + random.nextInt(8), 24);
            }

            
//将认证码存入session 
            session.setAttribute(
"rand", sRand);

            g.dispose();

            
//输出图象到页面 
            ImageIO.write(image, 
"JPEG", response.getOutputStream());
            out.clear();
            out
=pageContext.pushBody();
            
        
%>

    
</ body >
</ html >
 转自 http://bbs.8isp.cn/htm_data/11/0707/2221.html
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值