常用验证码功能实现大全

Posted усил

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用验证码功能实现大全相关的知识,希望对你有一定的参考价值。

一、随机字符串验证码

1.1、使用java实现随机字符串验证码

  • 创建画板:new BufferedImage()
  • 创建画笔:画板.getGraphics()
  • 随机生成内容:不同颜色的字符
  • 绘制内容:画笔.drawString()
  • 存储为图片发送:ImageIO.write(画板,图片类型,输出流)

(1)定长验证码

//创建web工程
public class NewCode extends HttpServlet {
	private Random random=new Random();//随机数对象
    private int width=80;
    private int height=30;
    private int fontsize=12;
    private String str="0123456789abcdef";//产生随机数的数据源
   
    //产生随机数
    private String randCode(){
    	String code="";
    	for(int i=0;i<4;i++){
    		code+=str.charAt(random.nextInt(str.length()));
    	}
    	return code;
    }
    //生成随机颜色
    private Color randColor() {
    	//三原色的最大值为255,random.nextInt(256)的取值范围是0~255
		int r=random.nextInt(256);
		int g=random.nextInt(256);
		int b=random.nextInt(256);
		return new Color(r,g,b);

	}
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request,response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
          //1 创建画板
		    BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		  //2 创建画笔
		    Graphics2D pen=(Graphics2D)img.getGraphics();
		  //3 随机生成内容:不同颜色的字符
		    String code=randCode();
		  //4 绘制内容
		    //4.1设置绘制区域
		      pen.fillRect(0, 0, width, height);
		    //4.2设置字体
		      pen.setFont(new Font("微软雅黑",Font.BOLD,fontsize));
		    //4.3按顺序逐个绘制字符
		      for(int i=0;i<code.length();i++){
		    	  pen.setColor(randColor());
		    	  //绘制字符  code.chatAr(i)绘制的内容
		    	  pen.drawString(code.charAt(i)+"", 5+i*fontsize, (fontsize+height)/2);
		      }
		    //4.4绘制噪音线(可有可无)
		      
		  //5 c存为图片发送:ImageIO.write(画板,图片类型,输出流)
		ServletOutputStream out=response.getOutputStream();
		ImageIO.write(img,"png",out);
		out.flush();
		out.close();
	}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>随机验证码</title>
	<style type="text/css">
		.code_a{
			color:#0000ff;
			font-size: 12px;
			text-decoration: none;
			cursor: pointer;
		}
		#imgCode{
			cursor: pointer;
		}
	</style>
  </head>
  
  <body>
    <form action="" method="post">
    	<label>验证码:</label>
		<input type="text" name="inCode" id="inCode"/>
		<img src="code21" align="center" id="imgCode" >
		<a href="" class="code_a">换一张</a><br />
    	<input type="submit" value="登录"/>
    </form>
	<div class="" style="color: red;">
		${err}
	</div>
  </body>
</html>

注意:img中的src路径地址取决于你的创建项目的Servlet类路径配置

效果图


(2)不定长验证码

//产生最少4个字符的随机字符串
    private String randCode(int len){
    	if(len<4){
    		len=4;
    	}
    	//更改宽度
    	width=5+fontsize*len;
    	//生成字符串
    	String code="";
    	for(int i=0;i<len;i++){
    		code+=str.charAt(random.nextInt(str.length()));
    	}
    	return code;
    }

(3)增加噪音线

//4.4绘制噪音线
for(int i=0;i<2;i++){
    pen.setColor(randColor());
    pen.setStroke(new BasicStroke(3));//设置线条粗细为3px
    pen.drawLine(random.nextInt(width/2), random.nextInt(height), 
    random.nextInt(width), random.nextInt(height));//起始坐标到终点坐标
}


(4)换一张功能

 function changeCode(){
	      var imgCode=document.getElementById("imgCode");
	      //因为每次访问的图片路径都是code21,浏览器不会进行刷新。故可以产生一个随机数使其路径发生改变,从而使浏览器刷新
	      imgCode.src="code21?"+Math.random();
	   }

对验证码进行验证

//当随机字符串生成后,将其保存在会话中
request.getSession().setAttribute("valicode", code);
//在创建一个Servlet用来验证验证码是否正确
//得到数据
		String inCode=request.getParameter("inCode").toString().toLowerCase();
		String valiCode=request.getSession().getAttribute("valicode").toString().toLowerCase();
//判断是否正确
		if(valiCode.equals(inCode)){
			response.sendRedirect("index.jsp");
		}else{
			request.getSession().setAttribute("err", "验证码错误");
			//返回上一页
			String url=request.getHeader("Referer");
			response.sendRedirect(url);
		}
	}
//在jsp中的表单action修改为验证该验证码是否为正确的Servlet类映射路径

1.2、使用jQuery实现随机字符串验证码

<%@ 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>
	<style type="text/css">
		.code_a{
			color:#0000ff;
			font-size: 12px;
			text-decoration: none;
			cursor: pointer;
		}
		#cvs{
			cursor: pointer;
			
		}
	</style>
	<script src="js/l22.js"></script>
	<script>
		var valicode;
	   function changeCode(){
	      var imgCode=document.getElementById("cvs");
	       valicode=drawCode(cvs);
	   }
	   function valiCode(){
		   var code=document.getElementById("inCode").value;
		   if(code.toLowerCase() == valicode.toLowerCase()){
			   return true;
		   }
		   else{
			  var err=document.getElementById("err").innerHTML="输入的验证码错误!";
			   changeCode();
			   return false;
		   }
	   }
	   window.onload=changeCode;
	</script>
  </head>
  
  <body>
    <form action="index.jsp" method="post">
    	<label>验证码:</label>
		<input type="text" name="inCode" id="inCode"/>
		<canvas id="cvs" onclick="changeCode()"></canvas>
		<a class="code_a" onclick="changeCode()">换一张</a><br />
    	<input type="submit" value="登录" onclick=" return valiCode()"/>
    </form>
	<div class="" style="color: red;" id="err"></div>
  </body>
</html>

//宽度、高度、字符大小、字符集
var w=80;
var h=24;
var fontsize=h-6;
var str ="0123456789ABCDEF"

//随机生成最大值不超过max的随机数
function randInt(max){
	return Math.floor(Math.random()*100000%max);
}

//生成随机长度的字符串验证码
function randCode(len){
	if(len<4){
		len=4;
	}
	var code="";
	for(var i=0;i<len;i++){
		code+=str.charAt(randInt(str.length));
		}
		return code;
}

//生成随机颜色
function randColor(){
	var r=randInt(256);
	var g=randInt(256);
	var b=randInt(256);
	return "rgb("+r+","+g+","+b+")"
}

//生成随机图片
function drawCode(canvas){
	var valicode=randCode(4);
	w=5+fontsize*valicode.length;
	
	if(canvas!=null && canvas.getContext && canvas.getContext("2d")){
		//设置显示区域大小
		canvas.style.width=w;
		//设置画板的宽度和高度
		canvas.setAttribute("width",w);
		canvas.setAttribute("height",h);
		//得到画笔
		var pen=canvas.getContext("2d");
		//绘制背景
		pen.fillStyle="rgb(255,255,255)";
		pen.fillRect(0,0,h,w);
		//设置水平线位置
		pen.textBaseline="top";
		//绘制内容
		for(var i=0;i<valicode.length;i++){
			pen.fillStyle=randColor();
			pen.font="bold"+(fontsize+randInt(3))+"px 微软雅黑";
			pen.fillText(valicode.charAt(i),5+fontsize*i,randInt(5));
		}
		//绘制噪音线
		for(var i=0;i<2;i++){
			pen.moveTo(randInt(w)/2,randInt(h));//设置起点
			pen.lineTo(randInt(w),randInt(h));//设置终点
			pen.strokeStyle=randColor();
			pen.lineWidth=2;//设置粗细
			pen.stroke();//绘制
		}
		return valicode;
	}
}

二、算术验证码

2.1、java实现算术验证码

  • 跟随机字符串的方式差不多,只是将内容改为算术而已
  • 因此只需要修改生成的内容,及判断条件即可
//全局
 private String str="+-*/";
 private int value=-1;//保存计算结果
 private String randCode(){
    	int one=random.nextInt(100);
    	int two=random.nextInt(100);
    	char op=str.charAt(random.nextInt(str.length()));
    	switch (op) {
		case '+':
			value=one+two;
			break;
        case '-'IOS开发-OC学习-常用功能代码片段整理

21个常用代码片段

asp中如何实现随机4位数的验证码?

canvas实现验证码功能

thinkphp3.2验证码怎么写

Zabbix中小型企业Zabbix监控实战之告警大全