Java生成验证码

<span style="color:#ff0000">Servlet生成验证码:</span>


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

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/*
 * 生成验证码
 */
@RestController
@RequestMapping("/checkCode")
public class CheckCode {
	  @RequestMapping("getCode")
		public static void checkCode(HttpServletRequest request, HttpServletResponse response) throws IOException{
			BufferedImage bi = new BufferedImage(68,22,BufferedImage.TYPE_INT_RGB);
			Graphics g = bi.getGraphics();
			Color c = new Color(100,199,255);
			g.setColor(c);
			g.fillRect(0, 0, 68, 22);		
			char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".toCharArray();
			Random r = new Random();
			int len=ch.length,index;
			StringBuffer sb = new StringBuffer();
			for(int i=0; i<4; i++){
				index = r.nextInt(len);
				g.setColor(new Color(r.nextInt(88),r.nextInt(188),r.nextInt(255)));
				g.drawString(ch[index]+"", (i*15)+3, 18);
				sb.append(ch[index]);
			}
			//放入session中与客户端传过来的值比较验证
			request.getSession().setAttribute("piccode", sb.toString().toUpperCase());
			ImageIO.write(bi, "JPG", response.getOutputStream());
			System.out.println(sb.toString().toUpperCase());
		}
	}
<%@ 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>My JSP 'index.jsp' starting page</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">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript">
		function reloadCode(){
			
			//让浏览器区别缓存
			var time = new Date().getTime();
			document.getElementById("imagecode").src="<%=request.getContextPath() %>/checkCode/getCode?d="+time;
		}
	</script>
  </head>
  
  <body>
  <form action="<%=request.getContextPath() %>/checkCode/getCode" method="get">
    验证码:<input type="text" name="checkcode"/>
    <img alt="验证码" id="imagecode" src="<%=request.getContextPath() %>/checkCode/getCode"/>
    <a href="javascript: reloadCode();">看不清楚</a><br>
    <input type="submit" value="提交">
    </form>
  </body>
</html>

利用第三方开源工具生成验证码:

引入jar包kaptcha.jar

在web.xml中进行配置,如下

 

<!-- 登陆验证码Kaptcha -->
	<servlet>
		<servlet-name>Kaptcha</servlet-name>
		<servlet-class>
			com.google.code.kaptcha.servlet.KaptchaServlet
			
			<!--数字加法实现类 com.xycq.controller.KaptchaServlet -->
		</servlet-class>
		<init-param>
			<description>图片边框,合法值:yes , no</description>
			<param-name>kaptcha.border</param-name>
			<param-value>yes</param-value>
		</init-param>
		<init-param>
			<description>
				边框颜色,合法值: r,g,b (and optional alpha) 或者
				white,black,blue.
			</description>
			<param-name>kaptcha.border.color</param-name>
			<param-value>black</param-value>
		</init-param>
		<init-param>
			<description>边框厚度,合法值:>0</description>
			<param-name>kaptcha.border.thickness</param-name>
			<param-value>1</param-value>
		</init-param>
		<init-param>
			<description>图片宽 200</description>
			<param-name>kaptcha.image.width</param-name>
			<param-value>200</param-value>
		</init-param>
		<init-param>
			<description>图片高 50</description>
			<param-name>kaptcha.image.height</param-name>
			<param-value>50</param-value>
		</init-param>
		<init-param>
			<description>图片实现类</description>
			<param-name>kaptcha.producer.impl</param-name>
			<param-value>
				com.google.code.kaptcha.impl.DefaultKaptcha
			</param-value>
		</init-param>
		<init-param>
			<description>文本实现类</description>
			<param-name>kaptcha.textproducer.impl</param-name>
			<param-value>
				<!--中文哦 com.xycq.controller.ChineseText -->
				com.google.code.kaptcha.text.impl.DefaultTextCreator
			</param-value>
		</init-param>
		<init-param>
			<description>文本集合,验证码值从此集合中获取</description>
			<param-name>kaptcha.textproducer.char.string</param-name>
			<param-value>1234567890</param-value>
		</init-param>
		<init-param>
			<description>验证码长度 4</description>
			<param-name>kaptcha.textproducer.char.length</param-name>
			<param-value>4</param-value>
		</init-param>
		<init-param>
			<description>字体 Arial, 纯中文最好不要用Arial,会乱码Courier</description>
			<param-name>kaptcha.textproducer.font.names</param-name>
			<param-value>Courier</param-value>
		</init-param>
		<init-param>
			<description>字体大小 40px.</description>
			<param-name>kaptcha.textproducer.font.size</param-name>
			<param-value>40</param-value>
		</init-param>
		<init-param>
			<description>
				字体颜色,合法值: r,g,b 或者 white,black,blue.
			</description>
			<param-name>kaptcha.textproducer.font.color</param-name>
			<param-value>black</param-value>
		</init-param>
		<init-param>
			<description>文字间隔 2</description>
			<param-name>kaptcha.textproducer.char.space</param-name>
			<param-value>2</param-value>
		</init-param>
		<init-param>
			<description>干扰实现类</description>
			<param-name>kaptcha.noise.impl</param-name>
			<param-value>
				<!-- com.google.code.kaptcha.impl.NoNoise -->
				com.google.code.kaptcha.impl.DefaultNoise
			</param-value>
		</init-param>
		<init-param>
			<description>
				干扰颜色,合法值: r,g,b 或者 white,black,blue.
			</description>
			<param-name>kaptcha.noise.color</param-name>
			<param-value>black</param-value>
		</init-param>
		<init-param>
			<description>
				图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple
				鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
				阴影com.google.code.kaptcha.impl.ShadowGimpy
			</description>
			<param-name>kaptcha.obscurificator.impl</param-name>
			<param-value>
				com.google.code.kaptcha.impl.WaterRipple
			</param-value>
		</init-param>
		<init-param>
			<description>背景实现类</description>
			<param-name>kaptcha.background.impl</param-name>
			<param-value>
				com.google.code.kaptcha.impl.DefaultBackground
			</param-value>
		</init-param>
		<init-param>
			<description>背景颜色渐变,开始颜色</description>
			<param-name>kaptcha.background.clear.from</param-name>
			<param-value>green</param-value>
		</init-param>
		<init-param>
			<description>背景颜色渐变,结束颜色</description>
			<param-name>kaptcha.background.clear.to</param-name>
			<param-value>white</param-value>
		</init-param>
		<init-param>
			<description>文字渲染器</description>
			<param-name>kaptcha.word.impl</param-name>
			<param-value>
				com.google.code.kaptcha.text.impl.DefaultWordRenderer
			</param-value>
		</init-param>
		<init-param>
			<description>
				session中存放验证码的key键
			</description>
			<param-name>kaptcha.session.key</param-name>
			<param-value>KAPTCHA_SESSION_KEY</param-value>
		</init-param>
		<init-param>
			<description>
				The date the kaptcha is generated is put into the
				HttpSession. This is the key value for that item in the
				session.
			</description>
			<param-name>kaptcha.session.date</param-name>
			<param-value>KAPTCHA_SESSION_DATE</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>Kaptcha</servlet-name>
		<url-pattern>/randomcode.jpg</url-pattern>
	</servlet-mapping>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>randomcode</title>
<script type="text/javascript">
	function changeR(node){
		// 用于点击时产生不同的验证码
		node.src = "randomcode.jpg?time="+new Date().getTime() ;	
	}
</script>
</head>
<body>
<img alt="random" src="randomcode.jpg" onclick="changeR(this)" style="cursor: pointer;">
	<form action="check.jsp">
		<input type="text" name="r">
		<input type="submit" value="校验">
	</form>	
</body>
</html>

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>check</title>
</head>
<body>
	<%
		// 检查是否是正确的验证码
		String k = (String) session
				.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
		String str = request.getParameter("r");
		if (k.equals(str))
			out.print("true\n");
		out.print(k + "=" + str);
	%>
</body>
</html>

 

import java.util.Random;

import com.google.code.kaptcha.text.TextProducer;
import com.google.code.kaptcha.util.Configurable;

/*
 * 中文验证码
 */
public class ChineseText extends Configurable implements TextProducer {

	//纯中文
	public String getText() {
		int length = getConfig().getTextProducerCharLength();
		//char[] charS = getConfig().getTextProducerCharString();
		
		String[] s = new String[]{"我","是","文","字","验","证","码","来","玩","啊"};

		Random rand = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < length; i++){
			int ind = rand.nextInt(s.length);
			sb.append(s[ind]);
		}
		return sb.toString();
	}
	
	
	//中文加字符
	public String getText1() {
		int length = getConfig().getTextProducerCharLength();
		String finalWord = "", firstWord = "";
		int tempInt = 0;
		String[] array = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
				"a", "b", "c", "d", "e", "f" };

		Random rand = new Random();

		for (int i = 0; i < length; i++) {
			switch (rand.nextInt(array.length)) {
			case 1:
				tempInt = rand.nextInt(26) + 65;
				firstWord = String.valueOf((char) tempInt);
				break;
			case 2:
				int r1,
				r2,
				r3,
				r4;
				String strH,
				strL;// high&low
				r1 = rand.nextInt(3) + 11; // [11,14)
				if (r1 == 13) {
					r2 = rand.nextInt(7);
				} else {
					r2 = rand.nextInt(16);
				}

				r3 = rand.nextInt(6) + 10;
				if (r3 == 10) {
					r4 = rand.nextInt(15) + 1;
				} else if (r3 == 15) {
					r4 = rand.nextInt(15);
				} else {
					r4 = rand.nextInt(16);
				}

				strH = array[r1] + array[r2];
				strL = array[r3] + array[r4];

				byte[] bytes = new byte[2];
				bytes[0] = (byte) (Integer.parseInt(strH, 16));
				bytes[1] = (byte) (Integer.parseInt(strL, 16));

				firstWord = new String(bytes);
				break;
			default:
				tempInt = rand.nextInt(10) + 48;
				firstWord = String.valueOf((char) tempInt);
				break;
			}
			finalWord += firstWord;
		}
		return finalWord;
	}
}
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.util.Config;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;
import javax.imageio.ImageIO;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
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.springframework.web.bind.annotation.RequestMapping;

/*
 * 数字加法验证码
 */

public class KaptchaServlet extends HttpServlet implements Servlet {
	private Properties props;
	private Producer kaptchaProducer;
	private String sessionKeyValue;

	public KaptchaServlet() {
		this.props = new Properties();

		this.kaptchaProducer = null;

		this.sessionKeyValue = null;
	}

	public void init(ServletConfig conf) throws ServletException {
		super.init(conf);

		ImageIO.setUseCache(false);

		Enumeration initParams = conf.getInitParameterNames();
		while (initParams.hasMoreElements()) {
			String key = (String) initParams.nextElement();
			String value = conf.getInitParameter(key);
			this.props.put(key, value);
		}

		Config config = new Config(this.props);
		this.kaptchaProducer = config.getProducerImpl();
		this.sessionKeyValue = config.getSessionKey();
	}

	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setDateHeader("Expires", 0L);

		resp.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");

		resp.addHeader("Cache-Control", "post-check=0, pre-check=0");

		resp.setHeader("Pragma", "no-cache");

		resp.setContentType("image/jpeg");

		String capText = this.kaptchaProducer.createText();
		String s1 = capText.substring(0, 1);
		String s2 = capText.substring(1, 2);
		int r = Integer.valueOf(s1).intValue() + Integer.valueOf(s2).intValue();

		req.getSession().setAttribute(this.sessionKeyValue, String.valueOf(r));

		BufferedImage bi = this.kaptchaProducer.createImage(s1+"+"+s2+"=?");

		ServletOutputStream out = resp.getOutputStream();

		ImageIO.write(bi, "jpg", out);
		try {
			out.flush();
		} finally {
			out.close();
		}
	}
}

 

 

最近在整理一些资源工具,放在网站分享 http://tools.maqway.com
欢迎关注公众号:麻雀唯伊 , 不定时更新资源文章,生活优惠,或许有你想看的

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值