`
xlaohe1
  • 浏览: 127191 次
  • 性别: Icon_minigender_1
  • 来自: 来处
社区版块
存档分类
最新评论

Java Servlet 验证码生成与验证

阅读更多
代码都很简单,先看看效果,其它的直接看代码都会懂的:



验证码图片生成servlet:
总共就三步:
1)使用BufferedImage 创造一个图片
2)就是设置文字和一些干扰(颜色都是随机的)
  a) 设置背景色
  b) 随机画10条直线
  c) 生成4个随机的数字字母,这就是验证码
3)然后使用ImageIO写入到response的outputstream

就这么简单。

package com.luoyh.servlet;

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

import java.io.FileInputStream;
import java.net.URL;
import java.net.URLDecoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.util.Random;
import java.awt.Color;
import java.awt.Font;
/**
 * 创建随机图片验证码的servlet
 * 验证码存放在session当中
 * 在HandlerCode做验证处理
 * @see HandlerCode
 */
public class ValidateCode  extends HttpServlet {

        private static final long serialVersionUID = -1534235656L;

		private static final int[] FONT_STYLES = {Font.PLAIN, Font.ITALIC, Font.BOLD};
		// 0-9 a-z A-Z
		private static final int[] CHS = {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 
			65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
			97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122};
		private static final int LINE_NUM = 10;
		// draw line numbers
		private static final int FONT_NUM = 3;

        protected void doGet(HttpServletRequest request,  HttpServletResponse response)  {
			try {
				// w: image width, h: image height, x: draw string begin x 
				int w = 150, h = 40, x = 20;
				// create code
				String code = "";
				BufferedImage newBi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
				Graphics g = newBi.getGraphics();
				setColor(g);
				g.fillRect(0, 0, w, h);
				// rand draw line
				for(int i = 0; i < LINE_NUM; i ++) {
					setColor(g);
					g.drawLine(getRandom(w), getRandom(h), getRandom(w), getRandom(h));
				}
				// draw 4 character
				for(int i = 0; i < 4; i ++) {
					setColor(g);
					setFont(g);
					String ch = Character.toString((char)CHS[getRandom(62)]);
					code += ch;
					g.drawString(ch, x + getRandom(20), getRandom(h / 2) + 15 );
					x += 25;
				}
				// put code in session
				HttpSession session = request.getSession();
				session.setAttribute("code", code);
				System.out.println(code);
				// write image in response ouput stream
				ImageIO.write(newBi, "png", response.getOutputStream());
			} catch (Exception ex) {
				System.out.println("error");
			}
        }
		private void setFont(Graphics g) {
			g.setFont(new Font("Consolas", FONT_STYLES[getRandom(FONT_NUM)], 24));
		}
		private int getRandom(int rand) {
			return new Random().nextInt(rand);
		}
		private void setColor(Graphics g) {
			g.setColor(new Color(new Random().nextInt(0xffffff)));
		}

        protected void doPost(HttpServletRequest request,  HttpServletResponse response)  {
               doGet(request, response);
        }

		// test
		// use load image
		private FileInputStream readFile(String fileName) throws Exception {
			URL url = Thread.currentThread().getContextClassLoader().getResource("com/luoyh/servlet");

			String protocol = url.getProtocol(), code = url.getFile();
			//System.out.println("protocol: " + protocol + "code: " + code);
			String path = URLDecoder.decode(code, "utf-8");
			
			return new FileInputStream(path + "/" + fileName);
		}

}	


下面就是验证的servlet:
package com.luoyh.servlet;

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

import java.io.IOException;

/**
 * 验证码异步验证处理servlet
 **/ 
public class HandlerCode  extends HttpServlet {

		/**
		 * success return 0 else error.
		 *
		 */
        protected void doGet(HttpServletRequest request,  HttpServletResponse response) throws IOException  {
			try {
				String inputCode = request.getParameter("inputCode"),
					   sessionCode = (String) request.getSession().getAttribute("code");

				if(sessionCode == null || inputCode == null) {
					response.getWriter().write("-1");
					return;
				}
				// is equals
				if(inputCode.toUpperCase().equals(sessionCode.toUpperCase())) {
					response.getWriter().write("0");
				} else {
					response.getWriter().write("1");
				}
			} catch (Exception ex) {
				response.getWriter().write("-1");
			}
		}

        protected void doPost(HttpServletRequest request,  HttpServletResponse response)  throws IOException {
               doGet(request, response);
        }


}	


页面代码:
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<title>-DEMO-</title>

		<meta name="description" content="User login page" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<script type="text/javascript" src="jquery-2.1.0.min.js"></script>

	<style>
		a {
			text-decoration: none;
		}
	</style>
	  <script type="text/javascript">
		$(function(){

			// submit click handl
			$('#submit').click(function() { 
				$.ajax({
					url : '/demo/handler?inputCode=' + $('#code').val(),
					success: function(d) {
						if(d != '0') { // fail
							refresh();
						} else { // ok
							$('#code').attr('disabled', '');
							alert('Its ok!');
						}
						console.log(d);
					}
				});
			});
			// code refresh
			// set input disabled and empty 
			var refresh = function() {
				$('#code').removeAttr('disabled');
				$('#code').val('');
				$('#codeImg').attr('src', $('#codeImg').attr('_src') + '?t=' + new Date().getTime());
			};
			$('#refresh').click(function() {
				refresh();
			});
		});
	  </script>

	</head>

	<body>
		验证码:
		<input id="code" type="text" value="" />
		<a id="refresh" href="javascript:;">
			<img _src="<%=request.getContextPath()%>/validate" id="codeImg" src="<%=request.getContextPath()%>/validate" alt="" width="150" height="40" />
		</a>
		<br/>
		<input id="submit" type="button" value="确认" />  
		<hr>
	</body>
</html>



web.xml
	<servlet>
		<servlet-name>validate</servlet-name>
		<servlet-class>com.luoyh.servlet.ValidateCode</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>validate</servlet-name>
		<url-pattern>/validate</url-pattern>
	</servlet-mapping>

	
	<servlet>
		<servlet-name>handler</servlet-name>
		<servlet-class>com.luoyh.servlet.HandlerCode</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>handler</servlet-name>
		<url-pattern>/handler</url-pattern>
	</servlet-mapping>



  • 大小: 2.8 KB
分享到:
评论

相关推荐

    java用servlet实现登陆验证码

    一个小的例子,里面有纯4位数字验证码,还有大小写字母和数字混合验证码,帮助各位理解验证码的生成原理

    java web写的验证码生成和验证

    用java写的自动生成验证码图片,和验证,用的servlet技术

    java web 登录验证码生成类

    生成验证码图片 java类中获得验证码的方法: session.getAttribute("checkcode"); jsp页面中显示图片的方式: ${pageContext.request.contextPath}/checkcode.jsp"/&gt; 另外在web.xml中配置验证码类的加载: ...

    java jsp 生成彩色验证码+验证功能代码,可直接运行,没有数据库

    该文件中有两个彩色验证码生成和验证的例子,都是独立的,一个是汉字形式,另一个是数字+字母形式

    servlet+jsp实现验证码demo

    servlet+jsp实现验证码 具体步骤: 生成图片所要实现的类 1、定义BufferedImage对象 2、获得Graphics对象 3、使用Random生成随机验证码信息 4、使用Graphics绘制图片 5、记录验证信息到session 6、使用ImageIO生成...

    servlet生成验证码

    java写的用servlet生产验证码供登录验证使用

    java用户登录验证码 filter过滤

    login登录界面,出现验证码,验证码是servlet后台生成的, 有一个验证码生成bean供大家使用。 filter过滤验证验证码是否正确

    Jsp servlet验证码工具类分享

    昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证,顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类,以供大家做个参考。 1、添加VeriyCodeUtils类生成验证码图像 package ...

    Java Web开发之图形验证码的生成与使用方法

    本文实例讲述了Java Web开发之图形验证码的生成与使用方法。分享给大家供大家参考。具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度。 图形验证码的使用包括如下3...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    java 验证码

    这是一个servlet类,它主要用于图片验证码的生成和保存验证码信息以方便登陆验证它综合了0、数字,1、字母,2、汉字,3、数字+字母,4~、数字+字母+汉字等验证码,可以设置验证码的个数,字体样式,图片高度全部在...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    验证码工具类

    kaptcha是google开源的一个非常实用的验证码生成工具类,可以利用kaptcha生成各种各样的验证码,但是它没有上传到maven中央仓库。kaptcha的工作原理是调用com.google.code.kaptcha.servlet.KaptchaServlet生成一个...

    jsp引用servlet生成的验证码代码演示

    此演示代码主要包括以下三部分:1.checkCode.java:用于生成验证码2.checkCodeServler3.check.jsp 验证下面是checkCode.java的内容: 代码如下://用于获取四位随机数 private char mapTable[] = {‘0′,’1′,’2′...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    Java案例开发锦集

    案例1 用户登录验证的完整程序 案例2 MD5的Javabean实现 案例3 用公钥计算消息摘要的验证码 案例4-1 Java中的数字证书的生成及维护方法 案例4-2 数字证书的签发(签名) 案例4-3 利用数字证书给...

    jsp页面验证码demo

    在java后台中生成验证码的ImageIO传到前端页面显示,同时把验证码的value值传入session 中用于与用户输入的验证码进行匹配,在用户验证中使用ajax技术,在不刷新页面的同时进行验证码验证。 程序结构图: ...

Global site tag (gtag.js) - Google Analytics