package servlet;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.geom.AffineTransform;
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;
public class SecurityCodeServlet extends HttpServlet {
private Color getRandColor(int s, int e) {
Random random = new Random();
if (s > 255)
s = 255;
if (e > 255)
e = 255;
int r = random.nextInt(e - s) + s; // 随机生成RGB中的R值
int g = random.nextInt(e - s) + s; // 随机生成RGB中的G值
int b = random.nextInt(e - s) + s; // 随机生成RGB中的B值
return new Color(r, g, b);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "No-cache");
response.setDateHeader("Expires", 0);
//指定生成的响应图片
response.setContentType("image/jpeg");
int width = 150; //指定生成验证码图片的宽度
int heigh = 60; //指定生成验证码图片的高度
//获得图像数据缓冲对象
BufferedImage bi = new BufferedImage(width,heigh,BufferedImage.TYPE_INT_RGB);
//获得图形上下文的抽象基类
Graphics g = bi.getGraphics();
Random r = new Random();
Font f = new Font("黑体",Font.PLAIN,60); //定义字体样式
g.setColor(getRandColor(200, 250)); //设置背景颜色
g.fillRect(0, 0, width, heigh); //绘制背景
g.setFont(f); //设置字体
g.setColor(getRandColor(180, 200)); //设置前景颜色
Graphics2D g2d = (Graphics2D) g;
//画一条折线
BasicStroke bs=new BasicStroke(5f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //创建一个供画笔选择线条粗细的对象
g2d.setStroke(bs); //改变线条的粗细
g2d.setColor(Color.DARK_GRAY); //设置当前颜色为预定义颜色中的深灰色
int[] xPoints=new int[8];
int[] yPoints=new int[8];
for(int j=0;j<8;j++){
xPoints[j]=r.nextInt(width - 1);
yPoints[j]=r.nextInt(heigh - 1);
}
g2d.drawPolyline(xPoints, yPoints,8);
String sRand = "";
String ctmp = "";
int itmp = 0;
for (int i = 0; i < 6; i++) {
switch (r.nextInt(2)) {
case 1:
itmp = r.nextInt(26) + 65; // 生成A~Z的字母
ctmp = String.valueOf((char) itmp);
break;
default:
itmp = r.nextInt(10) + 48; // 生成0~9的数字
ctmp = String.valueOf((char) itmp);
break;
}
sRand += ctmp;
//设置每个字符的随机颜色
Color color = new Color(20 + r.nextInt(210), 20 + r.nextInt(210), 20 + r.nextInt(210));
g2d.setColor(color);
//设置每个字符的随机字体
g2d.setFont(this.getRandomFont());
//设置每个字符的随机旋转
AffineTransform at = new AffineTransform();
int number = r.nextInt(3)-1;
double role = number*r.nextDouble()*(Math.PI/4);
at.setToRotation(role,25*i+5,55-r.nextInt(20)); //role:旋转角度,后面两个参数是设置围绕坐标点旋转
g2d.setTransform(at);
g2d.drawString(ctmp, 25*i+5,55-r.nextInt(20));
}
HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(5*60);//设置session对象5分钟失效
session.setAttribute("code", sRand.toString());
g2d.dispose();
System.out.println(sRand);
ImageIO.write(bi, "JPEG", response.getOutputStream());
}
public static Font getRandomFont() {
//String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};
String[] fonts = {"a_TrianglerCmUp","Astarisborn","WishfulWaves"};
Random r = new Random();
int fontIndex = r.nextInt(fonts.length);
return new Font(fonts[fontIndex], r.nextInt(3),50-r.nextInt(20));
}
}
把字体加入到操作系统中

- 大小: 3.7 KB
分享到:
相关推荐
验证码通常由一组随机生成的字母、数字或者两者混合组成,有时会带有扭曲、旋转、加噪等效果以增加机器识别的难度。为了生成这样的验证码,我们需要以下几个步骤: 1. **生成随机字符串**:C#中的`System.Random`类...
3. **随机性**:每次生成验证码时,应从字体库中随机选择字体,且每个字符可能使用不同的字体,这样可以避免攻击者通过分析固定模式来破解验证码。 4. **可读性与安全性平衡**:一个好的验证码字体库必须在提高安全...
3. **随机旋转**:为了增加验证码的复杂性,我们可以让每个字符在图像中以随机角度旋转。这可以通过在绘制字符时应用`Graphics.Transform`属性中的旋转矩阵来实现。旋转的角度可以是随机生成的,范围可以在一定角度...
2、自定义验证码字体、字体颜色、字体样式、字体大小; 3、自定义验证码背景、背景颜色、边框、边框颜色、随机颜色; 4、自定义杂点、曲线、曲线宽度、曲线数量、字体旋转角度 5、自定义验证码位数、宽度、高度、...
3. **字体混搭**:使用不同的字体、大小和颜色来绘制验证码字符,进一步混淆机器识别。 4. **时间限制**:验证码有有效期,过期后需要重新获取,防止攻击者长时间使用同一个验证码。 5. **安全性考虑**:验证码的...
- **颜色变化**:随机选择字体颜色,增加验证码的多样性。 - **字体混搭**:使用不同字体和大小的数字,使得验证码更难被自动化程序识别。 总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供...
通过调整文本的旋转角度、倾斜程度、位移等属性,以及应用随机的变形函数,可以实现字体的扭曲效果。 3. **颜色与噪声**:为了增加视觉干扰,验证码通常会使用随机颜色和噪声。可以使用`SolidColorBrush`填充背景,...
首先,创建一个`BufferedImage`对象作为验证码的画布,然后设置背景色,接着在画布上随机位置绘制随机颜色的线条和点。 4. **扭曲和旋转**: 为了让验证码更难被机器读取,可以对每个字符进行轻微的扭曲和旋转。...
3. **背景处理**:为了增加安全性,验证码图片的背景应该有随机的颜色和干扰元素。可以使用`imagefill()`函数填充背景色,并通过随机生成的颜色和线条增加干扰。 4. **添加干扰码**:干扰码包括随机分布的线条和点...
生成验证码图片涉及图像处理,包括设置图片尺寸、背景色、字体、颜色、扭曲、干扰线、噪点等。Python中的`PIL`(Pillow)库或Java的`java.awt.image.BufferedImage`类可以用于创建和操作图像。 5. **扭曲与变形**:...
在Qt中实现随机验证码,主要涉及到图像处理、随机数生成以及字体操作等技术。 1. **随机数生成**: 首先,我们需要生成随机数字或字母作为验证码的内容。在C++中,可以使用`<random>`库来创建随机数生成器。例如,...
可以设定背景色、字体颜色、字体样式,以及添加一些噪声线和点来增加可读性。 ```csharp Bitmap bitmap = new Bitmap(100, 30); // 验证码图像尺寸 Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White)...
接着,使用`imagecolorallocate()`分配不同颜色给每个字符,并用`imagettftext()`在图像上绘制随机旋转的字符。为了增加干扰,还可以在图像上随机生成噪点。 ```php $image = imagecreatetruecolor(100, 30); $...
2. **扭曲和变形**:为了增加机器识别的难度,验证码通常会经过扭曲、旋转、缩放等图像处理,使得字符看起来不规则。 3. **颜色干扰**:在背景或字符上添加随机颜色,可以进一步混淆机器视觉系统。 4. **噪声线**...
- 为每个字符选择随机字体、大小、倾斜角度和颜色。 - 使用`Font`类创建字体对象,`DrawString()`方法将字符绘制到Bitmap上。 5. **添加噪声**: - 为了增加复杂性,可以在图像上绘制随机线段或点,模拟噪点。 ...
可以设置字体、颜色、旋转角度等属性,以增加字符的可读性难度。 4. **扭曲与干扰**:为了进一步提高安全性,通常会在图像中添加噪声,如随机线条、斑点或者扭曲字符,使得自动化工具更难识别。这可以通过在画布上...
在生成验证码时,系统会随机选择字体文件,扭曲字符,添加背景噪声,以及可能的旋转和缩放,以增强安全性。同时,这些字体也可以与其他技术结合,如颜色变化、位图化或添加纹理,来进一步提升验证码的抗自动化攻击...
这可以通过在画布上添加随机的线性或曲线变形,或者随机旋转每个字符来实现。 4. **保存验证码**:生成的验证码图像需要存储在服务器端,同时验证码内容也需要保存在一个安全的地方,如`Session`对象中。这样,当...
2. **颜色和字体**:设置验证码文本的颜色和字体,以便与背景形成对比,增加辨识度。 3. **文本绘制**:在图像上绘制随机字符串,可能包括随机的位置偏移、角度旋转等。 4. **噪声添加**:向图像添加随机噪声点或...