验证码功能实现(java awt)

采用java awt以及前端 java httpservlet方面的知识

环境要求:tomcat服务器知识

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录</title>
	</head>
	<body>
		<form action="LoginCheckServlet" method="post">
		<p>账号:<input type="text" name="userName"/></p>
		<p>密码:<input type="password" name="userPwd"/></p>
		<p>验证码:<input type="text" name="userCode" maxlength="4"/>
		<img height="30" src="ValidateCodeServlet" width="100" id="validateCodeImg"/>
		</p>
		<p><input type="submit" value="登录"/></p>
		</form>
		
		
		<script type="text/javascript">
			var img=document.getElementById("validateCodeImg");
			
			img.onclick=function()
			{
				img.src="ValidateCodeServlet?m="+Math.random();
			}
		
		</script>
	</body>
</html>

import java.io.IOException;

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

/**
 * Servlet implementation class LoginCheckServlet
 */
@WebServlet("/LoginCheckServlet")
public class LoginCheckServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginCheckServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//1.接收账号、密码、验证码
		String userName=request.getParameter("userName");
		String userPwd=request.getParameter("userPwd");
		String usercode=request.getParameter("userCode");
		//2.从session取出生成验证码时存储的正确的验证码
		HttpSession session=request.getSession();
		String vcode=(String) session.getAttribute("vcode");
		//3.将用户输入的验证码和从session取出的正确的验证码进行对比
		if(usercode.equals(vcode))
		{
			//验证码正确,继续校验账号和密码
			System.out.println("----验证码正确");
		}
		else 
		{
			//验证码错误
			System.out.println("----验证码错误");
		}
		
		
	}

}

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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class ValidateCodeServlet
 */
@WebServlet("/ValidateCodeServlet")
public class ValidateCodeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ValidateCodeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//接收客户端请求生成验证码图片
		
		//使用java提供的awt工具包动态生成一个验证码图片
		//创建一行图片
		int width=300;//验证码宽度
		int height=90;//验证码高度
		BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
		//2.绘制图片
		//从图片对象中获取绘制图片的“笔”
		Graphics2D pen=image.createGraphics();
		
		//绘制背景
		pen.setColor(getRandomColor());
		//绘制实心矩形
		pen.fillRect(0, 0,width, height);
		
		//绘制验证码字符串
		int letterNum=4;
		int space=20;
		int letterWidth=(width-(letterNum+1)*space)/letterNum;//计算每个字母占据的宽度
		
		//for循环每循环一次,绘制一个字母(小写字母ascii码 97-122)
		String vcode="";
		Random random=new Random();
		for(int i=0;i<letterNum;i++)
		{
			//随机生成一个小写字母
			int ascii=random.nextInt(26)+97;
			byte[]bs= {(byte)ascii};
			String letter=new String(bs);
			vcode=vcode+letter;
			//
			pen.setColor(getRandomColor());
			pen.setFont(new Font("Gulim",Font.BOLD,70));
			pen.drawString(letter, space+(letterWidth+space)*i, height-space);
		}
		System.out.println("生成的验证码:"+vcode);
		HttpSession session=request.getSession();
		session.setAttribute("vcode", vcode);
		
		
		
		//图片绘制完成之后,将图片通过response的输出流响应到客户端
		ImageIO.write(image, "png", response.getOutputStream());
		
		
	}
	//产生一种随机颜色
	private Color getRandomColor() 
	{
//		int r=(int) Math.floor(Math.random()*256);
//		int g=(int) Math.floor(Math.random()*256);
//		int b=(int) Math.floor(Math.random()*256);
		Random random=new Random();
		int r=random.nextInt(256);
		int g=random.nextInt(256);
		int b=random.nextInt(256);
		Color color=new Color(r,g,b);
		return color;
		
	}
	
	
}

 点击验证码还会改变,最好在验证码上再加上几笔,避免图像识别出来

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值