验证码验证功能
博客专区 > xjcyxyx 的博客 > 博客详情
验证码验证功能
xjcyxyx 发表于4年前
验证码验证功能
  • 发表于 4年前
  • 阅读 1137
  • 收藏 13
  • 点赞 0
  • 评论 1

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

摘要: 验证码验证功能
  • JSP

JSP页面实现验证码输出


验证码:<input type="text" id="randomCode" name="randomCode" value="" maxlength="4">
 <img id="randomCodeImg" src="randomCodeServlet" alt="看不清?点击更换" style="cursor:hand;" onClick="refreshRandomCode()"/>
 <a id="nview" href="#" onClick="refreshRandomCode()" class="left">看不清?</a>



js实现切换验证码



<script type="text/javascript">
function refreshRandomCode(){ 
  $("#randomCodeImg").attr("src","randomCodeServlet?time="+new Date());
 }
</script>


  • Servlet


<!--randomCode -->
 <servlet>
  <servlet-name>randomCodeServlet</servlet-name>
  <servlet-class>com.mp.platform.web.servlet.RandomCodeServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>randomCodeServlet</servlet-name>
  <url-pattern>/randomCodeServlet</url-pattern>
 </servlet-mapping>


  • Java

Util类:RandomCodeServlet.java

package com.mp.platform.web.servlet;

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

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

/**
 * @描述: 用于生成随机验证码
 */
public class RandomCodeServlet extends HttpServlet
{
	
	private static final long serialVersionUID = 1L;
	
	
	@SuppressWarnings("unused")
	private static Logger logger = Logger.getLogger(RandomCodeServlet.class);
	
	
	private int width = 60;// 图片宽度
	
	
	private int height = 20;// 图片高度
	
	
	private int codeCount = 4;// 验证码个数
	
	
	private int x = 0;
	
	
	private int fontHeight;// 字体高度
	
	
	private int codeY;
	
	
	char[] codeSequence =
	{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
	
	
	
	
	/**
	 * 初始化图片属性
	 */
	public void init() throws ServletException
	{
		// 读取web.xml获取初始信息
		String sWidth = getInitParameter("width");
		String sHeight = getInitParameter("height");
		String sCodeCount = getInitParameter("codeCount");
		
		try
		{
			if (sWidth != null && sWidth.length() > 0)
			{
				width = Integer.parseInt(sWidth);
			}
			if (sHeight != null && sHeight.length() > 0)
			{
				height = Integer.parseInt(sHeight);
			}
			if (sCodeCount != null && sCodeCount.length() > 0)
			{
				codeCount = Integer.parseInt(sCodeCount);
			}
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		
		x = width / (codeCount + 1);
		fontHeight = height - 2;
		codeY = height - 4;
	}
	
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
	        IOException
	{
		// 定义图像buffer
		BufferedImage 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);
		
		
		// 创建字体,字体的大小应该根据图片的高度来定。
		Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
		// 设置字体。
		g.setFont(font);
		
		
		// 画边框。
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, width - 1, height - 1);
		
		
		// 随机产生20条干扰线,使图象中的认证码不易被其它程序探测到。
		g.setColor(Color.BLACK);
		for (int i = 0; i < 0; i++)
		{
			int x = random.nextInt(width);
			int y = random.nextInt(height);
			int xl = random.nextInt(12);
			int yl = random.nextInt(12);
			g.drawLine(x, y, x + xl, y + yl);
		}
		
		
		// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
		StringBuffer randomCode = new StringBuffer();
		int red = 0, green = 0, blue = 0;
		
		
		// 随机产生codeCount数字的验证码。
		for (int i = 0; i < codeCount; i++)
		{
			// 得到随机产生的验证码数字。
			String strRand = String.valueOf(codeSequence[random.nextInt(10)]);
			// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
			red = random.nextInt(255);
			green = random.nextInt(255);
			blue = random.nextInt(255);
			
			
			// 用随机产生的颜色将验证码绘制到图像中。
			g.setColor(new Color(red, green, blue));
			g.drawString(strRand, (i + 0.5f) * x, codeY);
			
			
			// 将产生的四个随机数组合在一起。
			randomCode.append(strRand);
		}
		
		
		// 将四位数字的验证码保存到Session中。
		HttpSession session = request.getSession();
		session.setAttribute("randomCode", randomCode.toString());
		
		
		// 禁止图像缓存。
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		response.setContentType("image/jpeg");
		
		
		// 将图像输出到Servlet输出流中。
		ServletOutputStream sos = response.getOutputStream();
		ImageIO.write(buffImg, "jpeg", sos);
		sos.close();
		
	}
}



然后比较获取输入的验证码和从session获取的验证码是否一致

String randomCode = request.getParameter("randomCode");
randomCode.equals(request.getSession().getAttribute("randomCode"))

标签: 验证码
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 28
码字总数 4019
评论 (1)
isam
验证码最好放到cookie里面就好了,用不着session。
×
xjcyxyx
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: