java实现验证码详解编程语言

第一步:在web.xml中配置servlet

<servlet> 
    <servlet-name>ImageServlet</servlet-name> 
    <servlet-class>org.servlet.ImageServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
	<servlet-name>ImageServlet</servlet-name> 
	<url-pattern>/ImageServlet</url-pattern> 
</servlet-mapping>

第二步: ImageServlet 实现

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import com.farm.web.tool.RandomValidateCode; 
 
public class ImageServlet extends HttpServlet { 
 
	private static final long serialVersionUID = 1L; 
 
	public void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException { 
 
		response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片 
		response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容 
		response.setHeader("Cache-Control", "no-cache"); 
		response.setDateHeader("Expire", 0); 
		RandomValidateCode randomValidateCode = new RandomValidateCode(); 
		try { 
			randomValidateCode.getRandcode(request, response);// 输出图片方法 
		} catch (Exception e) { 
			e.printStackTrace(); 
		} 
	} 
 
	public void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException { 
		doGet(request, response); 
	} 
 
}

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.util.Random; 
 
import javax.imageio.ImageIO; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
public class RandomValidateCode { 
 
	public static String validateCode = null; 
	public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key 
	private Random random = new Random(); 
	private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串 
 
	private int width = 80;// 图片宽 
	private int height = 26;// 图片高 
	private int lineSize = 40;// 干扰线数量 
	private int stringNum = 4;// 随机产生字符数量 
 
	/* 
	 * 获得字体 
	 */ 
	private Font getFont() { 
		return new Font("Fixedsys", Font.CENTER_BASELINE, 18); 
	} 
 
	/* 
	 * 获得颜色 
	 */ 
	private Color getRandColor(int fc, int bc) { 
		if (fc > 255) 
			fc = 255; 
		if (bc > 255) 
			bc = 255; 
		int r = fc + random.nextInt(bc - fc - 16); 
		int g = fc + random.nextInt(bc - fc - 14); 
		int b = fc + random.nextInt(bc - fc - 18); 
		return new Color(r, g, b); 
	} 
 
	/** 
	 * 生成随机图片 
	 */ 
	public void getRandcode(HttpServletRequest request, 
			HttpServletResponse response) { 
		HttpSession session = request.getSession(); 
		// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类 
		BufferedImage image = new BufferedImage(width, height, 
				BufferedImage.TYPE_INT_BGR); 
		Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作 
		g.fillRect(0, 0, width, height); 
		g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)); 
		g.setColor(getRandColor(110, 133)); 
		// 绘制干扰线 
		for (int i = 0; i <= lineSize; i++) { 
			drowLine(g); 
		} 
		// 绘制随机字符 
		String randomString = ""; 
		for (int i = 1; i <= stringNum; i++) { 
			randomString = drowString(g, randomString, i); 
		} 
		session.removeAttribute(RANDOMCODEKEY); 
		session.setAttribute(RANDOMCODEKEY, randomString); 
		validateCode = randomString.toUpperCase(); 
		g.dispose(); 
		try { 
			ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端 
		} catch (Exception e) { 
			e.printStackTrace(); 
		} 
	} 
 
	/* 
	 * 绘制字符串 
	 */ 
	private String drowString(Graphics g, String randomString, int i) { 
		g.setFont(getFont()); 
		g.setColor(new Color(random.nextInt(101), random.nextInt(111), random 
				.nextInt(121))); 
		String rand = String.valueOf(getRandomString(random.nextInt(randString 
				.length()))); 
		randomString += rand; 
		g.translate(random.nextInt(3), random.nextInt(3)); 
		g.drawString(rand, 13 * i, 16); 
		return randomString; 
	} 
 
	/* 
	 * 绘制干扰线 
	 */ 
	private void drowLine(Graphics g) { 
		int x = random.nextInt(width); 
		int y = random.nextInt(height); 
		int xl = random.nextInt(13); 
		int yl = random.nextInt(15); 
		g.drawLine(x, y, x + xl, y + yl); 
	} 
 
	/* 
	 * 获取随机的字符 
	 */ 
	public String getRandomString(int num) { 
		return String.valueOf(randString.charAt(num)); 
	} 
}


第三步:jsp展现

<tr> 
	<td> 
		<div align="right"> 
			验证码: 
		</div> 
	</td> 
	<td> 
		<input style="width: 65px" id="validatecode" name="validatecode" type="text" /> 
	</td> 
	<td> 
		<img title="看不清楚,换一张?" style="cursor: pointer;" 
			onclick="javascript:refresh(this);" 
			src="<PF:basePath/>/ImageServlet"> 
	</td> 
</tr>

src路径根据情况修改

function refresh(obj) { 
	obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();   
}

第四步:Action验证

if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCase().equals(RandomValidateCode.validateCode)){ 
	System.out.println("验证码正确"); 
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/14324.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论