`
菜鸟级JAVA
  • 浏览: 96780 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

页面添加验证码

阅读更多
先上图



我的这种方式由3部分代码组成:页面(html+js)、接口、工具类
1、页面代码如下:
function getCode(code) {
	var imgSrc = $("#cimg");
	imgSrc.attr("src", chgUrl(code));
}
function chgUrl(url) {
	var timestamp = (new Date()).valueOf();
	var url = url + "?timestamp=" + timestamp;
	return url;
}

<span class="userType">验证码:</span>
<input type="text" name="loginCode" class="loginCode" onBlur="checkregcode();" 	onFocus="regcodeE();" style="width: 40%;" />
<a href="javascript:void(0)" onclick="getCode('code.do')">
	<i><img src="code.do" style="width: 35%; height: 15%; 
	padding-top: -20px; vertical-align: middle;" id="cimg" />
	</i>
</a>


2、接口代码
package com.hzdracom.servlet;
/**
 * 
 * 生成验证码.
 * @author luozhenxing
 * 
 * @date 2015-04-15 
 *   
 * */
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.hzdracom.util.ValidateCode;
@Controller
public class ValidateCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	@RequestMapping(value = "/code", method = RequestMethod.GET, produces = "text/json;charset=UTF-8")
	protected void doGet(HttpServletRequest reqeust,
			HttpServletResponse response) throws ServletException, IOException {
		// 设置响应的类型格式为图片格式
		response.setContentType("image/jpeg");
		//禁止图像缓存。
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		HttpSession session = reqeust.getSession();
		
		ValidateCode vCode = new ValidateCode(120,40,4,0);
		session.setAttribute("code", vCode.getCode());
		vCode.write(response.getOutputStream());
	}

}


3、工具类(2个)
package com.hzdracom.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

/**
 * 验证码生成器
 * 
 * @author hf
 */
public class ValidateCode {
	// 图片的宽度。
	private int width = 160;
	// 图片的高度。
	private int height = 40;
	// 验证码字符个数
	private int codeCount = 5;
	// 验证码干扰线数
	private int lineCount = 100;
	// 验证码
	private String code = null;
	// 验证码图片Buffer
	private BufferedImage buffImg = null;

	// private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
	// 'I', 'J', 'K', 'L', 'M', 'N', 'P', 'Q',
	// 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', '1', '3', '4', '5', '6', '7',
	// '8', '9' };

	private char[] codeSequence = { '0', '1', '3', '4', '5', '6', '7', '8', '9' };

	public ValidateCode() {
		this.createCode();
	}

	/**
	 * @param width 图片宽
	 * @param height 图片高
	 */
	public ValidateCode(int width, int height) {
		this.width = width;
		this.height = height;
		this.createCode();
	}

	/**
	 * @param width 图片宽
	 * @param height 图片高
	 * @param codeCount 字符个数
	 * @param lineCount 干扰线条数
	 */
	public ValidateCode(int width, int height, int codeCount, int lineCount) {
		this.width = width;
		this.height = height;
		this.codeCount = codeCount;
		this.lineCount = lineCount;
		this.createCode();
	}

	public void createCode() {
		int x = 0, fontHeight = 0, codeY = 0;
		int red = 0, green = 0, blue = 0;

		x = width / (codeCount + 2);// 每个字符的宽度
		fontHeight = height - 2;// 字体的高度
		codeY = height - 4;

		// 图像buffer
		buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics2D g = buffImg.createGraphics();
		// 生成随机数
		Random random = new Random();
		// 将图像填充为白色
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, width, height);
		// 创建字体
		ImgFontByte imgFont = new ImgFontByte();
		Font font = imgFont.getFont(fontHeight);
		g.setFont(font);

		for (int i = 0; i < lineCount; i++) {
			int xs = random.nextInt(width);
			int ys = random.nextInt(height);
			int xe = xs + random.nextInt(width / 8);
			int ye = ys + random.nextInt(height / 8);
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			g.setColor(new Color(red, green, blue));
			g.drawLine(xs, ys, xe, ye);
		}

		// randomCode记录随机产生的验证码
		StringBuffer randomCode = new StringBuffer();
		// 随机产生codeCount个字符的验证码。
		for (int i = 0; i < codeCount; i++) {
			String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
			// 产生随机的颜色值,让输出的每个字符的颜色值都将不同。
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			g.setColor(new Color(red, green, blue));
			g.drawString(strRand, (i + 1) * x, codeY);
			// 将产生的四个随机数组合在一起。
			randomCode.append(strRand);
		}
		// 将四位数字的验证码保存到Session中。
		code = randomCode.toString();
	}

	public void write(String path) throws IOException {
		OutputStream sos = new FileOutputStream(path);
		this.write(sos);
	}

	public void write(OutputStream sos) throws IOException {
		ImageIO.write(buffImg, "png", sos);
		sos.close();
	}

	public BufferedImage getBuffImg() {
		return buffImg;
	}

	public String getCode() {
		return code;
	}
}

package com.hzdracom.util;

import java.io.ByteArrayInputStream;
import java.awt.*;

/**
 * ttf字体文件
 * 
 * @author hf
 */
public class ImgFontByte {
	public Font getFont(int fontHeight) {
		try {
			Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));
			return baseFont.deriveFont(Font.PLAIN, fontHeight);
		} catch (Exception e) {
			return new Font("Arial", Font.PLAIN, fontHeight);
		}
	}

	private byte[] hex2byte(String str) {
		if (str == null)
			return null;
		str = str.trim();
		int len = str.length();
		if (len == 0 || len % 2 == 1)
			return null;

		byte[] b = new byte[len / 2];
		try {
			for (int i = 0; i < str.length(); i += 2) {
				b[i / 2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();
			}
			return b;
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * ttf字体文件的十六进制字符串
	 * @author hf
	 * @return
	 */
	private String getFontByteStr() {
		return "0001000000100040000400c04f532f327d8175d4000087740000005650434c5461e3d9fb00008";
	}
}
  • 大小: 8.7 KB
分享到:
评论

相关推荐

    如梦CMS 添加验证码

    在如梦CMS中,我们可以利用SpringMVC的拦截器机制来实现在特定页面添加验证码。创建一个验证码服务类,生成并保存验证码,然后在需要验证的控制器方法前设置拦截器,检查用户输入的验证码是否与服务器生成的一致。...

    delphi7生成简单验证码

    5. **添加噪声**:为了混淆验证码,可以在图像上添加一些随机的线条或点,这可以通过在`Canvas`上随机绘制像素来实现。 6. **扭曲变形**:可选地,我们可以对验证码进行轻微的扭曲,比如改变字符之间的距离或者略微...

    java 登录案例之添加验证码案例分析

    本案例分析将深入探讨如何在已有登录系统的基础上添加验证码功能,以增强用户认证的安全性。 首先,我们需要理解验证码的基本流程。当用户尝试登录时,系统会生成一个随机的验证码图像,并将其存储在服务器端的`...

    .Net的jsp里添加验证码文件

    本压缩包提供的资源就是为了解决这个问题,它包含了一个用于在JSP页面中实现验证码功能的.NET代码示例。 验证码(CAPTCHA)是一种用于防止恶意自动程序(如机器人)进行欺诈性操作的技术,它要求用户通过图形识别出...

    js实现页面随机生成验证码(验证码混淆)-附件资源

    js实现页面随机生成验证码(验证码混淆)-附件资源

    页面随机验证码生成

    本项目着重于JSP页面上的验证码生成,结合后台Java代码,提供了一个完整的解决方案。 首先,验证码的核心在于其随机性和不可预测性。在JSP页面上,通常会有一个专门的图片元素显示验证码。这个图片是由服务器动态...

    验证码jar包小例子_导入即可

    最方便kaptcha验证码jar包,给页面添加验证码图片。

    登陆页面随机验证码

    2. **图像处理**:验证码通常以图像形式展示,图像中的验证码字符可能会扭曲、变形、旋转,甚至添加噪声或条纹,以增加识别难度。 3. **字体混搭**:使用不同的字体、大小和颜色来绘制验证码字符,进一步混淆机器...

    JavaScript实现页面动态验证码

    在本主题中,我们将深入探讨如何使用JavaScript实现一个页面动态验证码。验证码的主要目的是防止自动化的机器人程序对网站进行恶意操作,例如批量注册、垃圾评论等。 验证码通常包括一些随机生成的字符或数字,用户...

    .NET C# 页面登录验证码生成

    - **绘制验证码**:在图像上随机位置绘制验证码字符串,同时添加一些噪声线和点,提高机器识别的难度。 - **扭曲图像**:为了增加复杂性,可以对图像进行扭曲,如旋转、缩放或倾斜,`Graphics`类提供了相关方法。 ...

    页面js生成验证码

    页面JS生成验证码是一种常见的网页安全措施,用于防止恶意自动化脚本或机器人进行非法操作,如批量注册、恶意登录等。这种技术通常结合图像处理和JavaScript动态生成,使得每个用户看到的验证码都是独一无二的,需要...

    .net 生成验证码 代码 页面

    4. **在网页中显示验证码**:在ASP.NET网页中,添加一个`&lt;asp:Image&gt;`控件,并设置其`ImageUrl`属性指向生成验证码的网页URL。这样,每次请求该URL时,都会重新生成一个新的验证码。 5. **验证用户输入**:当用户...

    jsp登入界面添加验证码

    在开发Web应用时,为了增加安全性,通常会在用户登录界面添加验证码功能,防止恶意自动化的登录尝试或机器人攻击。在本教程中,我们将探讨如何在JSP(Java Server Pages)中实现这一功能。 首先,我们需要了解JSP的...

    ASP.NET页面验证码控件,方便快捷使用(附使用说明)

    在ASP.NET项目中,可以直接将此类库文件添加到项目的引用中,以便在页面上使用这个控件。将.dll文件复制到项目的`bin`目录下,这样项目就能识别并使用这个控件。 接下来,我们需要在`Web.config`文件中进行配置。`...

    extjs 登陆页面+验证码

    标题中的“extjs 登录页面+验证码”表明我们要讨论的是使用ExtJS框架构建的一个登录页面,其中包含了验证码功能。ExtJS是一个流行的JavaScript库,用于构建桌面级的Web应用程序,它提供了丰富的用户界面组件和强大的...

    JSP实现登录功能之添加验证码

    JSP实现登录功能的过程中添加验证码是一项重要的安全措施,可以有效防止自动化工具和机器人对登录接口的恶意攻击。验证码可以是一串字符、图形或者两者的结合,要求用户在登录时输入这串字符来证明自己是真实用户而...

    JAVA实现注册页面验证码刷新

    "JAVA实现注册页面验证码刷新"的课题旨在探讨如何在Java后端生成并更新前端显示的验证码,确保每次用户请求时都能显示新的、随机生成的验证码。下面将详细介绍这个过程涉及的关键知识点。 1. **验证码的生成**: -...

    jsp 登陆页面验证码的实现

    在网页开发中,验证码是一种常见的安全机制,用于防止恶意自动化的机器人或爬虫进行非法操作,比如批量注册、登录等。...通过这些步骤,我们可以实现一个基本的登录页面验证码功能,有效提高了系统安全性。

    ashx生成验证码实现无刷新页面更换验证码

    可以使用`System.Drawing`命名空间下的类,如`Bitmap`、`Graphics`和`Font`,来创建一个新的图像,绘制验证码字符串,并添加一些噪声线和扭曲效果,增加识别难度。 4. **无刷新更换**:实现无刷新更换验证码,通常...

    asp.net 网页上添加验证码

    ### ASP.NET 页面上添加验证码详解 #### 一、引言 在现代Web应用开发中,为了防止自动化工具或脚本对网站进行恶意攻击或者滥用,验证码(CAPTCHA)成为了一种常用的验证方式。本文将详细介绍如何在ASP.NET Web应用...

Global site tag (gtag.js) - Google Analytics