`

验证码 随机旋转、字体、颜色

阅读更多
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
分享到:
评论

相关推荐

    C#随机验证码随机验证码随机验证码

    验证码通常由一组随机生成的字母、数字或者两者混合组成,有时会带有扭曲、旋转、加噪等效果以增加机器识别的难度。为了生成这样的验证码,我们需要以下几个步骤: 1. **生成随机字符串**:C#中的`System.Random`类...

    验证码字体库

    3. **随机性**:每次生成验证码时,应从字体库中随机选择字体,且每个字符可能使用不同的字体,这样可以避免攻击者通过分析固定模式来破解验证码。 4. **可读性与安全性平衡**:一个好的验证码字体库必须在提高安全...

    asp.net 完美随机验证码

    3. **随机旋转**:为了增加验证码的复杂性,我们可以让每个字符在图像中以随机角度旋转。这可以通过在绘制字符时应用`Graphics.Transform`属性中的旋转矩阵来实现。旋转的角度可以是随机生成的,范围可以在一定角度...

    .net c# 自定义生成验证码

    2、自定义验证码字体、字体颜色、字体样式、字体大小; 3、自定义验证码背景、背景颜色、边框、边框颜色、随机颜色; 4、自定义杂点、曲线、曲线宽度、曲线数量、字体旋转角度 5、自定义验证码位数、宽度、高度、...

    登陆页面随机验证码

    3. **字体混搭**:使用不同的字体、大小和颜色来绘制验证码字符,进一步混淆机器识别。 4. **时间限制**:验证码有有效期,过期后需要重新获取,防止攻击者长时间使用同一个验证码。 5. **安全性考虑**:验证码的...

    JSP 随机验证码

    - **颜色变化**:随机选择字体颜色,增加验证码的多样性。 - **字体混搭**:使用不同字体和大小的数字,使得验证码更难被自动化程序识别。 总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供...

    验证码(字体)扭曲.NET

    通过调整文本的旋转角度、倾斜程度、位移等属性,以及应用随机的变形函数,可以实现字体的扭曲效果。 3. **颜色与噪声**:为了增加视觉干扰,验证码通常会使用随机颜色和噪声。可以使用`SolidColorBrush`填充背景,...

    java随机生成验证码

    首先,创建一个`BufferedImage`对象作为验证码的画布,然后设置背景色,接着在画布上随机位置绘制随机颜色的线条和点。 4. **扭曲和旋转**: 为了让验证码更难被机器读取,可以对每个字符进行轻微的扭曲和旋转。...

    支持中文字母数字和自定义字体的php验证码类

    3. **背景处理**:为了增加安全性,验证码图片的背景应该有随机的颜色和干扰元素。可以使用`imagefill()`函数填充背景色,并通过随机生成的颜色和线条增加干扰。 4. **添加干扰码**:干扰码包括随机分布的线条和点...

    自定义随机产生验证码

    生成验证码图片涉及图像处理,包括设置图片尺寸、背景色、字体、颜色、扭曲、干扰线、噪点等。Python中的`PIL`(Pillow)库或Java的`java.awt.image.BufferedImage`类可以用于创建和操作图像。 5. **扭曲与变形**:...

    Qt实现随机验证码功能

    在Qt中实现随机验证码,主要涉及到图像处理、随机数生成以及字体操作等技术。 1. **随机数生成**: 首先,我们需要生成随机数字或字母作为验证码的内容。在C++中,可以使用`&lt;random&gt;`库来创建随机数生成器。例如,...

    WinForm随机验证码-简单版

    可以设定背景色、字体颜色、字体样式,以及添加一些噪声线和点来增加可读性。 ```csharp Bitmap bitmap = new Bitmap(100, 30); // 验证码图像尺寸 Graphics g = Graphics.FromImage(bitmap); g.Clear(Color.White)...

    PHP生成随机验证码

    接着,使用`imagecolorallocate()`分配不同颜色给每个字符,并用`imagettftext()`在图像上绘制随机旋转的字符。为了增加干扰,还可以在图像上随机生成噪点。 ```php $image = imagecreatetruecolor(100, 30); $...

    随机验证码

    2. **扭曲和变形**:为了增加机器识别的难度,验证码通常会经过扭曲、旋转、缩放等图像处理,使得字符看起来不规则。 3. **颜色干扰**:在背景或字符上添加随机颜色,可以进一步混淆机器视觉系统。 4. **噪声线**...

    C#随机验证码的创建

    - 为每个字符选择随机字体、大小、倾斜角度和颜色。 - 使用`Font`类创建字体对象,`DrawString()`方法将字符绘制到Bitmap上。 5. **添加噪声**: - 为了增加复杂性,可以在图像上绘制随机线段或点,模拟噪点。 ...

    以图片形式,可生成随机验证码,用于登录验证,就如CSDN的验证码

    可以设置字体、颜色、旋转角度等属性,以增加字符的可读性难度。 4. **扭曲与干扰**:为了进一步提高安全性,通常会在图像中添加噪声,如随机线条、斑点或者扭曲字符,使得自动化工具更难识别。这可以通过在画布上...

    图片验证码特殊字体文件

    在生成验证码时,系统会随机选择字体文件,扭曲字符,添加背景噪声,以及可能的旋转和缩放,以增强安全性。同时,这些字体也可以与其他技术结合,如颜色变化、位图化或添加纹理,来进一步提升验证码的抗自动化攻击...

    asp.net生成随机验证码控件

    这可以通过在画布上添加随机的线性或曲线变形,或者随机旋转每个字符来实现。 4. **保存验证码**:生成的验证码图像需要存储在服务器端,同时验证码内容也需要保存在一个安全的地方,如`Session`对象中。这样,当...

    随机验证码 Code

    2. **颜色和字体**:设置验证码文本的颜色和字体,以便与背景形成对比,增加辨识度。 3. **文本绘制**:在图像上绘制随机字符串,可能包括随机的位置偏移、角度旋转等。 4. **噪声添加**:向图像添加随机噪声点或...

Global site tag (gtag.js) - Google Analytics