【js小案例】使用ajax实现验证码功能

首先创建一个验证码

<%@ page contentType="image/jpeg; charset=utf-8" 
		language="java" import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*"
		pageEncoding="UTF-8"%>
<!-- 以上导入awt和awt.image包 -->
<%!
		//获取随机颜色
		public Color getColor(){
			Random random = new Random();
			//使用rgb()随机产生颜色
			int r = random.nextInt(256);
			int g = random.nextInt(256);
			int b = random.nextInt(256);
			
			return new Color(r,g,b);
		}
		
		//获取随机数字  产生一个4位数
		public String getNum(){
			String str = "";
			Random random = new Random();
			for(int i = 0;i < 4;i++){
				str += random.nextInt(10); //0-9
			}
			return str;
		}
%>

<%
	 	/* 清除缓存 */
	 	response.setHeader("pragma", "mo-cache");
		response.setHeader("cache-control", "no-cache");
		response.setDateHeader("expires", 0);
		//产生矩形框
		BufferedImage image = new BufferedImage(80,30,BufferedImage.TYPE_INT_RGB);
		//获取画笔工具
		Graphics g = image.getGraphics();
		//设置矩形框的颜色
		g.setColor(new Color(200,200,200));
		//设置坐标和宽高
		g.fillRect(0, 0, 80, 30);
			 	
		//随机产生干扰线
		for(int i = 0;i < 30;i++){
			Random random = new Random();
			int x = random.nextInt(80);
			int y = random.nextInt(30);
			int x1 = random.nextInt(x + 10);
			int y1 = random.nextInt(y + 10);
			//设置随机颜色
			g.setColor(getColor());
			//画出来
			g.drawLine(x, y, x1, y1);
		}
		
		//字的颜色和数字
		g.setFont(new Font("Microsoft YaHei",Font.BOLD,16));
		g.setColor(Color.BLACK);
		//获取随机数字
		String checkNum = getNum();
		
		//给字拼接空格
		StringBuffer sb = new StringBuffer();
		for(int i = 0;i < checkNum.length();i++){
			sb.append(checkNum.charAt(i) + " ");
		}
		//画出数字
		g.drawString(sb.toString(), 15, 20);
		//存入session域中
		session.setAttribute("CHECKNUM", checkNum); //例如1010
		//将图像以jpeg的形式通过字节流输出
		ImageIO.write(image, "jpeg", response.getOutputStream());
		//清除缓存
		out.clear();
		//放入body中
		out = pageContext.pushBody();
%>


将验证码压缩成图片,在checkcode.jsp中引用,并在该页面中利用ajax向服务器发送数据

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>验证码</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<style type="text/css">
		table{
			margin: 100px auto;
		}
		
	</style>
  </head>
  
  <body>
  		<table border="0" align="center">
  			<tr>
  				<td>验证码</td>
  				<td><input type="text" name="checkcode" id="checkcodeID" maxlength="4" size="4"></td>
  				<td><img alt="加载失败" src="image.jsp"></td>
  				<td id="show">√√√</td>
  			</tr>
  		</table>
  </body>
  <script type="text/javascript">
  		//去除空格
		function trim(str){
			//从左侧开始替换空格
			str = str.replace(/^\s*/,"");
			//从左侧开始替换空格
			str = str.replace(/\s$/,"");
			return str;
		}
  	
  </script>
  
  <script type="text/javascript">
  		//创建ajax对象
  		function createAjax(){
			var ajax = null;
			try{
				ajax = new ActiveXObject("microsoft.xmlhttp");
			}catch(e){
				try{
					ajax = new XMLHttpRequest();
				}catch(e1){
					alert("请更换浏览器");
				}
			}
			return ajax;
  		}
  </script>
  
  
  <script type="text/javascript">
  		document.getElementById("checkcodeID").onkeyup = function(){
  			var checkcode = this.value;
  			//去除空格
  			checkcode = trim(checkcode);
  			if(checkcode.length == 4){
  				//获取ajax对象
  				var ajax = createAjax();
  				//获取去空格的内容
  				
  				var method = "POST";
  				var url = "${pageContext.request.contextPath}/CheckcodeServlet?time="+new Date().getTime();
  				//准备发送异步请求
  				ajax.open(method, url);
  				//设置请求头POST提交方式才需要
				ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
				//拼接实体内容
				var content = "checkcode=" + checkcode;  				
  				//发送请求
  				ajax.send(content);
  				
  				//监听服务器状态变化
  				ajax.onreadystatechange = function(){
  					if(ajax.readyState == 4){
  						if(ajax.status == 200){
  							//获取服务器内容
  							var tip = ajax.responseText;
  							//获取图片路径 然后进行放入td中
  							var img = document.createElement("img");
							img.src = tip;
							img.style.width = "14px";
							img.style.height = "14px";
							var td = document.getElementById("show");
							td.innerHTML = "";
							td.appendChild(img);
  						}
  					}
  				}
  				
  			}
  			
  		}
  </script>
</html>

然后编写服务端,接收输入的信息,判断是否与验证码相互匹配,将对应的图片的路径以输出流的方式输出

public class CheckcodeServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		//图片路径
		String tip = "images/MsgError.gif";
		
		String checkcode = req.getParameter("checkcode");
		//测试
		System.out.println(checkcode);
		//获取session域中的数字
		String checkcodeService = (String) req.getSession().getAttribute("CHECKNUM");
		//判断
		if (checkcode.equals(checkcodeService)) {
			tip = "images/MsgSent.gif";
		}
		//输出路径
		PrintWriter pw = resp.getWriter();
		pw.write(tip);
		pw.flush();
		pw.close();
	}
}
当输入第4个数字的时候就会出现提示

运行结果:









  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
采用ajax技术实现的图形验证码,在前端进行验证。验证码信息为图片。每一行代码均有注释,通俗易懂。 实现步骤: 1、创建web工程 2、在jsp页面,编写一个 3、编写一个servlet,在servlet中产生图形验证码 ------------------------------------------------------------ //1、给客户端作出的回应是以图片的方式来回应 response.setContentType("image/jpeg"); //2、创建一个图形缓冲区,用于绘制图形 (宽度,高度,颜色的生成方案) BufferedImage image = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB); //3、创建一支画笔(图形设备接口)用于绘图 Graphics g = image.getGraphics(); //4、指定图笔的颜色 g.setColor(getColor(200,256)); //5、绘制一个矩形框,作为验证码的背景 g.fillRect(0,0, 800,600); //产生一个输出流,准备把图片以流的方式,输出到客户端 OutputStream out = response.getOutputStream(); //输出在图形缓冲区中,绘制的图片 ImageIO.write(image,"jpg",out); //关闭流 out.close(); //随机生成背景颜色 private Random rd = new Random(); //产生随机数类 public Color getColor(int start,int end){ int r = start+rd.nextInt(end-start); int g = start+rd.nextInt(end-start); int b = start+rd.nextInt(end-start); return new Color(r, g, b);//根据三原色的值,随机在指定范围内,生成一种颜色 } --------------------------------------------------------------------------- 0-120 比较适合文字的颜色 100-200 适合干扰线条的颜色 200-255 适合背景颜色 --------------------------------------------------------------------------- 生成图片中的文字: 1、先编写一个字符串,包含:数字,大小字母 private String s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 2、在产生背景之后,编写如下代码,产生四个字符(并且,把生成字符,保存在session中,在登录的时候用来做判断) String code=""; //用于保存生成的四个字符 for(int i=0;i<4;i++){ //生成一个随机数,它的取值范围,一定要在s这个字符串的长度范围之内 int index = rd.nextInt(s.length()); //2 //把index作为下标,来取得字符串的中某一个字符 char c = s.charAt(index); //指定文字的颜色----深色段 g.setColor(getColor(0,120)); //创建一个字体 Font f = new Font("隶书",Font.ITALIC|Font.BOLD,60+rd.nextInt(60)); //把字体关联到画笔 g.setFont(f); code+=c; //把生成的字符连接成一个字符串 //把文字输出到图片上 g.drawString(String.valueOf(c), 100+i*80+rd.nextInt(100),200+rd.nextInt(150)); } request.getSession().setAttribute("code",code);//把生成的验证码信息,存储到session中,登录的时候,用来作判断 ------------------

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值