`
xlaohe1
  • 浏览: 128592 次
  • 性别: 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实现登陆验证码

    总的来说,这个Java Servlet验证码实现涵盖了Java Web开发的基础知识,包括Servlet生命周期、HTTP会话管理、图像处理以及随机数生成。理解这个过程对于提升Web应用的安全性是非常有帮助的。通过这个小例子,开发者...

    java web笔记之servlet生成验证码

    通过上述步骤,我们可以使用Servlet在Java Web应用中实现一个简单的验证码生成器。当然,实际项目中可能需要考虑更多的细节,如优化验证码的显示效果,增加时间戳防止重放攻击,以及结合其他安全措施等。

    Java后端产生验证码后台验证功能的实现代码

    Java后台验证码生成的实现主要包括以下几个步骤: 1. 生成验证码图片:使用BufferedImage类生成验证码图片,设置图片的宽度和高度,并创建一个随机数生成器类用于生成随机验证码。 2. 生成随机验证码:使用Random...

    登陆验证+servlet动态生成图片验证码

    本文将深入探讨“登陆验证”与“Servlet动态生成图片验证码”的相关知识点,并提供实践指导。 首先,让我们了解什么是登陆验证。登陆验证是系统在用户尝试访问受保护资源时,要求用户提供用户名和密码的过程。这个...

    利用servlet动态生成验证码

    接下来,我们需要将生成的验证码字符串保存在服务器端,以便稍后验证用户输入。这可以通过在session中存储验证码的方式实现。HttpSession对象允许我们在服务器端与用户的浏览器之间保持状态,只要用户不关闭浏览器,...

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

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

    Servlet生成图片验证码

    8. **验证用户输入**:当用户输入验证码并提交表单时,Servlet会检查输入的验证码是否与session中存储的原始验证码匹配。如果匹配,则验证成功;否则,提示用户重新输入。 验证码技术有多种变体,例如滑动验证码、...

    java servlet验证码和一个javascript菜单联动例子

    总之,这个"java servlet验证码和一个javascript菜单联动例子"展示了如何结合服务器端的Java Servlet技术和客户端的JavaScript来实现安全的用户交互。它强调了验证码在保护系统免受自动化攻击中的重要性,以及...

    使用Servlet生成图片验证码

    在这里,我们需要配置Servlet的映射路径,比如 `&lt;servlet-mapping&gt;` 和 `&lt;servlet&gt;` 标签,使得用户可以通过特定URL访问到验证码生成的Servlet。 最后,`shown.java`可能是Servlet的源代码,其中包含了验证码的生成...

    servlet生成验证码

    ### 二、验证码生成原理 验证码通常由随机字符组成,这些字符可以是数字、字母或特殊符号,有时还会加入背景噪声或扭曲效果以增加识别难度。在本例中,验证码是通过以下步骤生成的: 1. **定义字符集**:如`...

    java 生成动态gif 验证码

    - **Servlet**:在Servlet中调用工具类的方法,生成验证码并将其保存到服务器的一个临时目录,同时将验证码内容保存在Session中,以供后续验证使用。 - **响应客户端**:Servlet返回生成的GIF图像到客户端,通常...

    JAVA实现网站验证码功能demo(servlet)

    1. **验证码生成**: - 首先,创建一个Servlet类,如`VerificationCodeServlet`,继承`HttpServlet`。 - 在`doGet`方法中,生成一个随机字符串作为验证码。这个字符串通常包含数字和字母,长度可自定义,例如4位。...

    java 实现验证码(servlet+jsp)

    验证码生成后,将其保存在session中,以便后续页面提交时进行验证。同时,将图像URL传递给JSP页面: ```java request.getSession().setAttribute("verifyCode", code); request.getRequestDispatcher(...

    servlet生成验证码图片

    10. **安全性考虑**:虽然这种简单的验证码生成方式能防止一些基本的自动化攻击,但对于更复杂的爬虫或自动化工具,可能需要更高级的验证码技术,如滑动验证码、点击验证码、基于行为的验证码等。 总结来说,`...

    java生成图片验证码

    1. ValidateCodeImageCodeMade.java:这可能是验证码生成类的名称,它包含了生成随机字符串和创建图像的逻辑。这个类可能包含生成验证码字符串的方法,以及将字符串转化为图像的方法。其中可能包括对字体、颜色、...

    生成验证码(带详细注释、Servlet已获取生成的验证码和输入的验证码)

    总结,本项目实现了基于Java Servlet的验证码生成与验证功能,涵盖了随机数生成、图像处理、HTTP交互等多个技术点。通过对验证码的生成、发送、验证以及前端的交互处理,确保了用户输入的安全性和系统的可靠性。

    JSP+servlet验证码登陆

    在这个"JSP+servlet验证码登陆"的场景中,我们主要讨论的是如何在MVC(Model-View-Controller)架构下实现一个安全的登录系统,特别是涉及到验证码的生成和验证。 验证码是一种防止恶意自动程序(如机器人)进行...

    Java实现验证码验证功能

    本文将深入探讨如何使用Java编程语言来实现验证码验证,主要涉及Servlet、session以及画板对象等关键技术和概念。 首先,验证码(CAPTCHA)全称为“Completely Automated Public Turing test to tell Computers and...

    java完美的验证码生成

    本教程将详细讲解如何在Java环境下实现一个完美的、可定制的验证码生成系统。 首先,验证码的基本原理是生成一串随机字符串,并将其与图像结合,用户在看到图像后需输入对应的字符串,服务器端会验证用户输入的字符...

    Servlet生成动态验证码

    在验证码生成中,我们需要生成一系列不重复的字符,这可能需要用到`nextInt()`和`nextDouble()`方法。 6. 验证码的验证: 当用户输入验证码后,服务器会比较session中存储的验证码与用户提交的值是否一致,如果...

Global site tag (gtag.js) - Google Analytics