验证码大概如下:
------------------------
------------------------
------------------------
演示网站下载:
验证码多种多样,为了防止被机器识别,通常都会加入干扰元素,如绘制干扰线、干扰点、背景图片,还有让字符扭曲、旋转字符等等。
我个人认为验证扭曲或旋转字符这样的干扰元素比较好,因为加入干扰线,背景图片虽然强悍,但有时可能连人都认不出来,这个会让网站显得很不友好,用户不禁火大:(。
要实现扭曲验证码必须图象大一些(至少要每字符至少要40*40的尺寸)才看地清楚,但有时我们的需求可能不允许让一个如此大尺寸的图象,此时,何不考虑用旋转的形式呢?!
旋转验证码思路不难,分几步就可以完成:
遍历随机字符,每个字符生成一个图象
旋转每一个字符图象
将所有字符图象拼接成一个图象
其中,旋转图象调用 Graphics.RotateTransform() 方法,这个方法有个很糟糕的问题,就是旋转中心点是在图象坐标的(0,0)而不是图象的中心,这就产生了一个麻烦:旋转后越出图象大小的部分会被裁掉,要解决这个问题比较麻烦,网上现成的代码,为了简单起见,在 DrawString 时,调整一个 Point.X|Y,在旋转 [20, 50] 度,字体在 [12, 35]px 上基本没有问题。
C# 代码如下:
using&System.D
using&System.W
namespace&Oran.Image
&&&&///&&summary&
&&&&///&旋转的可视验证码图象
&&&&///&&/summary&
&&&&public&class&RotatedVlidationCode
&&&&&&&&public&enum&RandomStringMode
&&&&&&&&&&&&///&&summary&
&&&&&&&&&&&&///&小写字母
&&&&&&&&&&&&///&&/summary&
&&&&&&&&&&&&LowerLetter,
&&&&&&&&&&&&///&&summary&
&&&&&&&&&&&&///&大写字母
&&&&&&&&&&&&///&&/summary&
&&&&&&&&&&&&UpperLetter,
&&&&&&&&&&&&///&&summary&
&&&&&&&&&&&&///&混合大小写字母
&&&&&&&&&&&&///&&/summary&
&&&&&&&&&&&&Letter,
&&&&&&&&&&&&///&&summary&
&&&&&&&&&&&&///&数字
&&&&&&&&&&&&///&&/summary&
&&&&&&&&&&&&Digital,
&&&&&&&&&&&&///&&summary&
&&&&&&&&&&&&///&混合数字与大小字母
&&&&&&&&&&&&///&&/summary&
&&&&&&&&&&&&Mix
&&&&&&&&public&static&string&GenerateRandomString(int&length,&RandomStringMode&mode)
&&&&&&&&&&&&string&rndStr&=&string.E
&&&&&&&&&&&&if&(length&==&0)
&&&&&&&&&&&&&&&&return&rndS
&&&&&&&&&&&&//以数组方式候选字符,可以更方便的剔除不要的字符,如数字&0&与字母&o
&&&&&&&&&&&&char[]&digitals&=&new&char[10]&{&'0',&'1',&'2',&'3',&'4',&'5',&'6',&'7',&'8',&'9'&};
&&&&&&&&&&&&char[]&lowerLetters&=&new&char[26]&{
&&&&&&&&&&&&&&&&'a',&'b',&'c',&'d',&'e',&'f',&'g',&
&&&&&&&&&&&&&&&&'h',&'i',&'j',&'k',&'l',&'m',&'n',&
&&&&&&&&&&&&&&&&'o',&'p',&'q',&'r',&'s',&'t',&
&&&&&&&&&&&&&&&&'u',&'v',&'w',&'x',&'y',&'z'&};
&&&&&&&&&&&&char[]&upperLetters&=&new&char[26]&{
&&&&&&&&&&&&&&&&'A',&'B',&'C',&'D',&'E',&'F',&'G',&
&&&&&&&&&&&&&&&&'H',&'I',&'J',&'K',&'L',&'M',&'N',&
&&&&&&&&&&&&&&&&'O',&'P',&'Q',&'R',&'S',&'T',&
&&&&&&&&&&&&&&&&'U',&'V',&'W',&'X',&'Y',&'Z'&};
&&&&&&&&&&&&char[]&letters&=&new&char[52]{
&&&&&&&&&&&&&&&&'a',&'b',&'c',&'d',&'e',&'f',&'g',&
&&&&&&&&&&&&&&&&'h',&'i',&'j',&'k',&'l',&'m',&'n',&
&&&&&&&&&&&&&&&&'o',&'p',&'q',&'r',&'s',&'t',&
&&&&&&&&&&&&&&&&'u',&'v',&'w',&'x',&'y',&'z',
&&&&&&&&&&&&&&&&'A',&'B',&'C',&'D',&'E',&'F',&'G',&
&&&&&&&&&&&&&&&&'H',&'I',&'J',&'K',&'L',&'M',&'N',&
&&&&&&&&&&&&&&&&'O',&'P',&'Q',&'R',&'S',&'T',&
&&&&&&&&&&&&&&&&'U',&'V',&'W',&'X',&'Y',&'Z'&};
&&&&&&&&&&&&char[]&mix&=&new&char[62]{
&&&&&&&&&&&&&&&&'0',&'1',&'2',&'3',&'4',&'5',&'6',&'7',&'8',&'9',
&&&&&&&&&&&&&&&&'a',&'b',&'c',&'d',&'e',&'f',&'g',&
&&&&&&&&&&&&&&&&'h',&'i',&'j',&'k',&'l',&'m',&'n',&
&&&&&&&&&&&&&&&&'o',&'p',&'q',&'r',&'s',&'t',&
&&&&&&&&&&&&&&&&'u',&'v',&'w',&'x',&'y',&'z',
&&&&&&&&&&&&&&&&'A',&'B',&'C',&'D',&'E',&'F',&'G',&
&&&&&&&&&&&&&&&&'H',&'I',&'J',&'K',&'L',&'M',&'N',&
&&&&&&&&&&&&&&&&'O',&'P',&'Q',&'R',&'S',&'T',&
&&&&&&&&&&&&&&&&'U',&'V',&'W',&'X',&'Y',&'Z'&};
&&&&&&&&&&&&int[]&range&=&new&int[2]&{&0,&0&};
&&&&&&&&&&&&Random&random&=&new&Random();
&&&&&&&&&&&&switch&(mode)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&case&RandomStringMode.Digital:
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&&++i)
&&&&&&&&&&&&&&&&&&&&&&&&rndStr&+=&digitals[random.Next(0,&digitals.Length)];
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&case&RandomStringMode.LowerLetter:
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&&++i)
&&&&&&&&&&&&&&&&&&&&&&&&rndStr&+=&lowerLetters[random.Next(0,&lowerLetters.Length)];
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&case&RandomStringMode.UpperLetter:
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&&++i)
&&&&&&&&&&&&&&&&&&&&&&&&rndStr&+=&upperLetters[random.Next(0,&upperLetters.Length)];
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&case&RandomStringMode.Letter:
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&&++i)
&&&&&&&&&&&&&&&&&&&&&&&&rndStr&+=&letters[random.Next(0,&letters.Length)];
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&&++i)
&&&&&&&&&&&&&&&&&&&&&&&&rndStr&+=&mix[random.Next(0,&mix.Length)];
&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&}
&&&&&&&&&&&&return&rndS
&&&&&&&&///&&summary&
&&&&&&&&///&显示验证码
&&&&&&&&///&&/summary&
&&&&&&&&///&¶m&name="seed"&随机数辅助种子&/param&
&&&&&&&&///&¶m&name="strLen"&验证码字符长度&/param&
&&&&&&&&///&¶m&name="fontSize"&字体大小&/param&
&&&&&&&&///&¶m&name="mode"&随机字符模式&/param&
&&&&&&&&///&¶m&name="clrFont"&字体颜色&/param&
&&&&&&&&///&¶m&name="clrBg"&背景颜色&/param&
&&&&&&&&public&static&void&ShowValidationCode(ref&int&seed,&int&strLen,&int&fontSize,&RandomStringMode&mode,&Color&clrFont,&Color&clrBg)
&&&&&&&&&&&&int&tmpS
&&&&&&&&&&&&unchecked
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&tmpSeed&=&(int)(seed&*&DateTime.Now.Ticks);
&&&&&&&&&&&&&&&&++
&&&&&&&&&&&&}
&&&&&&&&&&&&Random&rnd&=&new&Random(tmpSeed);
&&&&&&&&&&&&string&text&=&GenerateRandomString(strLen,&mode);
&&&&&&&&&&&&int&height&=&fontSize&*&2;
&&&&&&&&&&&&int&width&=&height&*&text.L
&&&&&&&&&&&&Bitmap&bmp&=&new&Bitmap(width,&height);
&&&&&&&&&&&&Graphics&graphics&=&Graphics.FromImage(bmp);
&&&&&&&&&&&&Font&font&=&new&Font("Courier&New",&fontSize,&FontStyle.Bold);
&&&&&&&&&&&&Brush&brush&=&new&SolidBrush(clrFont);
&&&&&&&&&&&&Brush&brushBg&=&new&SolidBrush(clrBg);
&&&&&&&&&&&&graphics.FillRectangle(brushBg,&0,&0,&width,&height);
&&&&&&&&&&&&Bitmap&tmpBmp&=&new&Bitmap(height,&width&/&text.Length);
&&&&&&&&&&&&Graphics&tmpGph&=&null;
&&&&&&&&&&&&int°ree&=&40;
&&&&&&&&&&&&Point&tmpPoint&=&new&Point();
&&&&&&&&&&&&for&(int&i&=&0;&i&&&text.L&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&tmpBmp&=&new&Bitmap(height,&width&/&text.Length);
&&&&&&&&&&&&&&&&tmpGph&=&Graphics.FromImage(tmpBmp);
&&&&&&&&&&&&&&&&tmpGph.TextRenderingHint&=&System.Drawing.Text.TextRenderingHint.ClearTypeGridF
&&&&&&&&&&&&&&&&tmpGph.FillRectangle(brushBg,&0,&0,&tmpBmp.Width,&tmpBmp.Height);
&&&&&&&&&&&&&&&°ree&=&rnd.Next(20,&51);&//&[20,&50]随机角度
&&&&&&&&&&&&&&&&if&(rnd.Next(0,&2)&==&0)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&tmpPoint.X&=&12;&//&调整文本坐标以适应旋转后的图象
&&&&&&&&&&&&&&&&&&&&tmpPoint.Y&=&-6;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&°ree&=&~degree&+&1;&//&逆时针旋转
&&&&&&&&&&&&&&&&&&&&tmpPoint.X&=&-10;
&&&&&&&&&&&&&&&&&&&&tmpPoint.Y&=&6;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&tmpGph.RotateTransform(degree);
&&&&&&&&&&&&&&&&tmpGph.DrawString(text[i].ToString(),&font,&brush,&tmpPoint);
&&&&&&&&&&&&&&&&graphics.DrawImage(tmpBmp,&i&*&tmpBmp.Width,&0);&//&拼接图象
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&&&&&//输出图象
&&&&&&&&&&&&System.IO.MemoryStream&memoryStream&=&new&System.IO.MemoryStream();
&&&&&&&&&&&&bmp.Save(memoryStream,&System.Drawing.Imaging.ImageFormat.Gif);
&&&&&&&&&&&&HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
&&&&&&&&&&&&HttpContext.Current.Response.ClearContent();
&&&&&&&&&&&&HttpContext.Current.Response.ContentType&=&"image/gif";
&&&&&&&&&&&&HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
&&&&&&&&&&&&HttpContext.Current.Response.End();
&&&&&&&&&&&&//释放资源
&&&&&&&&&&&&font.Dispose();
&&&&&&&&&&&&brush.Dispose();
&&&&&&&&&&&&brushBg.Dispose();
&&&&&&&&&&&&tmpGph.Dispose();
&&&&&&&&&&&&tmpBmp.Dispose();
&&&&&&&&&&&&graphics.Dispose();
&&&&&&&&&&&&bmp.Dispose();
&&&&&&&&&&&&memoryStream.Dispose();
阅读(...) 评论()待解决问题&
学历认证时为什么手机验证码不能用
学历认证时为什么手机验证码不能用
更新时间: 17:30
我的手机是诺基亚X6的为什么在微信登录都是,服务器繁忙,错误,4,-3,在用手机号...
你好、是网络繁忙。你稍后在是。如果不行。 提问人的追问
16:05 连续几天了都是这样,手机号注册又没有接受到验证码信息。为什么???? 回答人的补充
16:07 可能是接入点错了。你现在用的是cmnet 吗?换cmwap试试
为什么高等教育网发信息查询***一直没有回复验证码
网络问题,只能等了。 或者多试几次
为什么我的金昌软件不能用
我发给你,要吗
学校有个机房,线路没有问题,为什么网上邻居不能用呢
导致Windows XP网络邻居不能正确浏览或浏览列表不全的因素很多,解决问题需要对症下药,而诊断过程分两个步骤:测试基本连接、解决文件共享问题。 一、解决基本连接问题。 1、检查计算机之间的物理连接。 网卡是网络连接的基本设备,在桌面计算机中,每个网卡后面的指示灯应该是亮的,这表示连接是正常的。如果不亮,请检查集线器或交换机是打开的,而且每个客户端连接的指示灯都是亮的,这表示链接是正常的。接下来检查网线的水晶头是否接触良好。 2、确保所有计算机上都***了 TCP/IP,并且工作正常。 在Windows XP 中默认***了 TCP/IP。但是,如果出了网络问题想卸载后重新*** TCP/IP 就不容易了:在“本地连接”属性中显示的此连接使用下列项目列表中单击 Internet 协议 (TCP/
请问辽宁的中专学历***书网上能不能验证和查询?在哪个网站
中专的学历 是没法查询的,国家教育网上面 只能查大专及以上的学历,中专和高中的只能到你们当地的教育厅去现场查询,没法再网上查询的 。
计算机工作时为什么不能移动计算机啊
硬盘主要由磁盘和磁头及控制电路组成,信息存储在磁盘上,磁头负责读出或写入。硬盘一开机,其磁盘就开始高速旋转。磁关可以采用轻质薄膜部件,盘片在高转下产生的气生的气流浮力迫使磁头离开盘面悬浮在盘片上方,浮力与磁头座架弹簧的反向弹力使得磁头保持平衡。这样的非接触式磁头可以有效地减小磨损和由摩擦产生的热量及阻力。 计算机工作时会对硬盘做读写操作,如果此时移动计算机,硬盘会产生震动,磁头就会因为震动而与高速转动的盘片接触,划伤盘片,产生坏道,严重者硬盘报废。
报关员考试网上报名时,照片规格都符合,为什么不能上传?
一、检查照片格式是否正确,具体格式如下:(1)考生本人近3个月内的彩色证件照,淡蓝色或者白色背景,无边框;正面照,免冠,无头饰。勿着制式服装,常戴眼镜的应佩戴眼镜。(2)JPEG格式,390×567像素,100KB以下,分辨率300dpi。(3)照片应由具有拍摄证件照片资格的专业照相机构拍摄,个人使用计算机摄像头、手机等非专业照相器材拍摄的照片无效。(4)网上报名照片上传失败者,发送照片及考生个人联系方式至,海关报关员考试指导工作人员义务提供修改、上传帮助。二、报名服务器较忙,选择空闲时间报名如果以上两种方法还是上传不上,请另择时或者择日上传,规避报名高峰引成的网络拥堵,建议在00:00-06:00这个时间段上传。
GMP中有一条:过滤料液(生物制药的)的滤膜不能用石棉材料的,为什么?有什么依据吗...
石棉是一种天然的纤维状矿物结晶,其化学成分含有铁、镁、铝、钙、镍等元素的硅酸盐复合物,作为过滤材料使用容易脱落细微纤维,并随产品进入人体,由于石棉在人体内很难***或排出,就会造成积累沉着。石棉已被国际癌症研究中心肯定为人类致癌物,会引起肺癌和肉皮瘤。石棉沉着病患者心血管系统变化的特征是心搏加快,肝功能检查发现大多数患者肝功受损 ,抗毒素和前凝血酶的形成功能降低。
中专学历可否深圳人才交流中心验证
没有必要去一个地方!! 这些你都去看看!! 深圳市人才大市场 时间:每天 地点:罗湖区宝安北路人才大场五楼 联系***:( 深圳女子市场 时间:每周二、四、六 地点:华强北路赛格科技工业园二栋二楼西(女人世界对面) ***:(、3200057 西部人力资源市场 时间:每周二、四、六 地点:深圳市南山区桃园西路南山人才大厦四楼 ***:( 宝安区人事局人才智力市场 时间:每周二、四、六 地点:深圳市宝安区宝城九区广场大厦二楼 ***:( 深圳中南人力资源市场 地址:罗湖区宝安北路1007 号(帝豪酒店往北100米) ***: 提问人的追问
09:51 谢谢你!请问也是在深
中专学历可否深圳人才交流中心验证?
没有必要去一个地方!!这些你都去看看!! 深圳市人才大市场 时间:每天 地点:罗湖区宝安北路人才大场五楼 联系***:( 深圳女子市场 时间:每周二、四、六 地点:华强北路赛格科技工业园二栋二楼西(女人世界对面) ***:(、3200057 西部人力资源市场 时间:每周二、四、六 地点:深圳市南山区桃园西路南山人才大厦四楼 ***:( 宝安区人事局人才智力市场 时间:每周二、四、六 地点:深圳市宝安区宝城九区广场大厦二楼 ***:( 深圳中南人力资源市场 地址:罗湖区宝安北路1007 号(帝豪酒店往北100米) ***:
你好、是网络繁忙。你稍后在是。如果不行。 提问人的追问
16:05 连续几天了都是这样,...
网络问题,只能等了。 或者多试几次...
我发给你,要吗...
&本站QQ官方微博:@jixiaoJE &
Copyright &&&(JE中专网)&&All Rights Reserved.
网站版权与免责声明
①由于各方面不确定的因素,有可能原文内容调整与变化,本网所提供的相关信息请网友以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权及个人隐私等问题,请在两周内邮件联系1185人阅读
Java web(26)
直接上图,验证码可以设置字符个数,字符颜色,背景颜色,旋转角度,新的字体。
请注意加载新字体那一块代码,一定要注册一下,不然带不出文字。
自己看代码吧。。。
package com.ukWord.
import com.ukWord.util.AppC
import mons.lang3.StringU
import sun.font.FontDesignM
import javax.imageio.ImageIO;
import javax.servlet.ServletE
import javax.servlet.ServletOutputS
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import java.awt.*;
import java.awt.image.BufferedI
import java.io.IOE
import java.io.InputS
import java.util.LinkedL
import java.util.L
import java.util.P
import java.util.R
public class SecurityCodeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private int width = 173;
private int height = 24;
private int fontSize =
private int securityCodeLength = 4;
private int interferingLineCount = 20;
private Font font = new Font(&Times New Romans&, Font.BOLD, fontSize);
private String charStr = &A0KLBMNC2PD3QRE4STF5UVG6WXH7YZ8J9秋花惨淡秋草黄耿耿秋灯秋夜长已觉秋窗秋不尽那堪风雨助凄凉&;
private String[]
private int charW
private int charH
public void init() throws ServletException {
Properties config = new Properties();
config.load(SecurityCodeServlet.class.getResourceAsStream(&/config.properties&));
String withStr = config.getProperty(&security.code.width&);
if(StringUtils.isNotEmpty(withStr)){
this.width = Integer.parseInt(withStr);
String securityCodeLengthStr = config.getProperty(&security.code.length&);
if(StringUtils.isNotEmpty(securityCodeLengthStr)){
this.securityCodeLength = Integer.parseInt(securityCodeLengthStr);
String interferingLineCountStr = config.getProperty(&security.code.interfering.line.count&);
if(StringUtils.isNotEmpty(interferingLineCountStr)){
this.interferingLineCount = Integer.parseInt(interferingLineCountStr);
String fontStr = config.getProperty(&security.code.fontStyle&);
if(StringUtils.isNotEmpty(fontStr)){
if(!StringUtils.contains(fontStr, &.ttf&)){
this.font = new Font(fontStr, Font.BOLD, fontSize);
this.font = registerFont(fontStr);
String charsStr = config.getProperty(&security.code.text&);
if(StringUtils.isNotEmpty(charsStr)){
this.charStr = charsS
this.chars = new String[charsStr.length()];
for(int i = 0; i & charsStr.length(); i++){
this.chars[i] = String.valueOf(charsStr.charAt(i));
FontMetrics fontMetrics = FontDesignMetrics.getMetrics(this.font);
this.charWidth = fontMetrics.stringWidth(&M&);
this.charHeight = fontMetrics.getHeight();
}catch(Exception e){
e.printStackTrace();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Random random = new Random();
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
g.setFont(this.font);
g.setColor(this.getRandomColor(random, 200, 55));
g.fillRect(0, 0, width, height);
g.setColor(this.getRandomColor(random, 100, 155));
g.drawRect(0, 0, width-1, height-1);
//画干扰线
g.setColor(this.getRandomColor(random, 0, 255));
g.setStroke(new BasicStroke(1f));
for (int i = 0; i & this.interferingLineC i++) {
int x = random.nextInt(this.width);
int y = random.nextInt(this.height);
int xl = random.nextInt(this.width);
int yl = random.nextInt(this.height);
g.drawLine(x, y, x + xl, y + yl);
//画旋转文字
int charX = 0;
List&String& chartList = this.getRandomString(random);
int charsRealWidth = this.charWidth * this.securityCodeL
if(this.width & charsRealWidth){
charX = (this.width - charsRealWidth)/2;
double radianPercent = 0D;
int chartY = this.height - 5;
for(String chart : chartList){
g.setColor(this.getRandomColor(random, 80, 120));
radianPercent =
Math.PI * (random.nextInt(60)/180D);
if(random.nextBoolean()) radianPercent = -radianP
g.rotate(radianPercent, charX + 9, chartY);
g.drawString(chart, charX, chartY);
g.rotate(-radianPercent, charX + 9, chartY);
charX += this.charW
//释放此图形的上下文以及它使用的所有系统资源
g.dispose();
//设置response类型
response.setContentType(&image/jpeg&);
//取消缓存
response.setHeader(&Pragma&, &no-cache&);
response.setHeader(&Cache-Control&, &no-cache&);
response.setDateHeader(&Expires&, 0);
//输出图像
ServletOutputStream os = response.getOutputStream();
ImageIO.write(buffImg, &jpeg&, os);
os.close();
//设置Session,将字符串转换成小写
request.getSession().setAttribute(AppConst.SECURITY_CODE_SESSION_KEY, StringUtils.join(chartList, &&).toLowerCase());
}catch (Exception e) {
e.printStackTrace();
private Font registerFont(String fontStr) throws Exception {
InputStream fontInputStream = SecurityCodeServlet.class.getClassLoader().getResourceAsStream(fontStr);
Font fontNew = Font.createFont(Font.TRUETYPE_FONT, fontInputStream);
Font fontNewPt = fontNew.deriveFont(Font.BOLD, this.fontSize);
fontInputStream.close();
//注意这里,如果不注册文字的话,什么都画不出来
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(fontNew);
return fontNewPt;
private List&String& getRandomString(Random random){
List&String& chartList = new LinkedList&String&();
for(int i = 0; i & this.securityCodeL i++){
String character = this.chars[random.nextInt(this.chars.length)];
character = (random.nextBoolean() == true ? character.toUpperCase() : character.toLowerCase());
chartList.add(character);
return chartL
private Color getRandomColor(Random random, int start, int max){
int r = start + random.nextInt(max);
int g = start + random.nextInt(max);
int b = start + random.nextInt(max);
return new Color(r, g, b);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:528695次
积分:4176
积分:4176
排名:第5679名
原创:125篇
评论:101条
(7)(5)(4)(1)(2)(1)(1)(4)(1)(1)(4)(1)(2)(1)(1)(3)(3)(1)(1)(6)(8)(2)(2)(1)(4)(2)(2)(1)(1)(2)(1)(1)(1)(1)(2)(1)(3)(1)(1)(3)(4)(2)(1)(1)(2)(1)(2)(5)(1)(2)(3)(2)(8)(6)