`

验证码的生成与使用,注意验证码session安全

阅读更多

       验证码是为了防止“黑客”利用暴力破解密码而出现的安全技术。比如如果没有验证码,一般登陆页面就会只有登陆名和密码,若“黑客”知道一个用户名后,就可以做一个程序,在那一直猜密码,(也就是暴力破解密码),可如果有的验证码后,这种暴力破解密码的方式就不行了。

       通过学习验证码的生成与使用,做一下笔记

1、新建web工程:


 2、验证码的本质是在java代码里,通过java的画笔画出来的。首先在jsp页面中添加img标签,来接收画出来的验证码图片,并且,这个图片的来源,也就是src属性,是一个web请求,本次练习使用的是servlet技术。jsp文件中的代码:

<img title="看不清?点击换一个" src="yanZhengCode.servlet"  id="YZcode" />
<p id="next" style="cursor: pointer;">换一张</p>

 3、生成验证码的java文件,也就是yanZhengCode.servlet(要在web.xml中进行配置)中的代码:

package com.wang;
/**
 * 生成验证码
 * @author HeJW
 *
 */
public class YanZheng extends HttpServlet implements Servlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/png");
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		
		//如果要全是数字,就把字母去掉
		//String charNumber = "0123456789abcdefghijklmnopqrstuvwxyz";
		String charNumber = "0123456789";
		Random r = new Random();
		String code = "" + charNumber.charAt(r.nextInt(charNumber.length()))
		+ charNumber.charAt(r.nextInt(charNumber.length()))
		+ charNumber.charAt(r.nextInt(charNumber.length()))
		+ charNumber.charAt(r.nextInt(charNumber.length()));
		
		//设置session,方便工程后面使用验证码的值
		request.getSession().setAttribute("YanZheng", code);
		// 生成这么大小的图片
		BufferedImage image = new BufferedImage(100, 45, BufferedImage.TYPE_INT_RGB);
		// 生成画笔
		Graphics g = image.getGraphics();
		// 把生成的图片背景色为淡灰色的
		g.setColor(Color.GRAY.brighter());
		g.fillRect(0, 0, image.getWidth(), image.getHeight());
		//验证码字符的大小
		Font f = new Font("IMPACT", Font.ITALIC, 30);
		g.setFont(f);
		for (int i = 0; i < code.length(); i++) {
			int y = 25;
			g.setColor(Color.black);
			g.drawString("" + code.charAt(i), image.getWidth() / code.length()* i, y);
		}
		ImageIO.write(image, "png", response.getOutputStream());
	}

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

}

 4、此时,在web页面中已经能够显示验证码了,验证码一帮还有一个“换一个”的功能,其实就是让img标签的src属性重新发送一遍,我用的是jquery:

$("#next").click(function() {
$('#YZcode')[0].src="<%=basePath%>yanZhengCode.servlet?timestamp="+new Date().getTime();
});

 5、我们再来看看验证码的使用:

package com.wang;

public class YanZhengTest extends HttpServlet implements Servlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response){
		
		HttpSession session = request.getSession();
		
		String yz = (String)request.getParameter("YZtext");
		
		String yzC = (String)session.getAttribute("YanZheng"); 
		//这样每次用完之后都清空一下session,防止验证码session攻击
		session.removeAttribute("YanZheng");
		
		if( yz.equals(yzC)){
			System.out.println("true");
		} else {
			System.out.println("false");
		}
		
		try {
			response.sendRedirect("index.jsp");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	protected void doPost(HttpServletRequest requset,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(requset, response);
	}

	
	
}

 6、全部源码:

web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>YanZhengCord</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<servlet>
		<servlet-name>Servlet1</servlet-name>
		<servlet-class>com.wang.YanZheng</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Servlet1</servlet-name>
		<url-pattern>/yanZhengCode.servlet</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>Servlet2</servlet-name>
		<servlet-class>com.wang.YanZhengTest</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Servlet2</servlet-name>
		<url-pattern>/yanZhengTest.servlet</url-pattern>
	</servlet-mapping>



</web-app>

 

index.jsp:

<%@ 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">
</head>

<script type="text/javascript" src="jquery-1.8.2.js"></script>
<script type="text/javascript">
	$(document).ready(function() {
		$("#next").click(function() {
			$('#YZcode')[0].src="<%=basePath%>yanZhengCode.servlet?timestamp="+new Date().getTime();
		});
		
	});
	
</script>

<body>

<img title="看不清?点击换一个" src="yanZhengCode.servlet"  id="YZcode" />
<p id="next" style="cursor: pointer;">换一张</p>

<form action="yanZhengTest.servlet" method="post">
验证码:<input type="text" id="YZtext" name="YZtext"/>
<input type="submit"/>
</form>


</body>
</html>

 生成验证码:

package com.wang;

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

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

/**
 * 生成验证码
 * @author HeJW
 *
 */
public class YanZheng extends HttpServlet implements Servlet {

	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/png");
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		
		
		//如果要全是数字,就把字母去掉
		//String charNumber = "0123456789abcdefghijklmnopqrstuvwxyz";
		String charNumber = "0123456789";
		Random r = new Random();
		String code = "" + charNumber.charAt(r.nextInt(charNumber.length()))
						+ charNumber.charAt(r.nextInt(charNumber.length()))
						+ charNumber.charAt(r.nextInt(charNumber.length()))
						+ charNumber.charAt(r.nextInt(charNumber.length()));
		
		//设置session,方便工程后面使用验证码的值
		request.getSession().setAttribute("YanZheng", code);
		// 生成这么大小的图片
		BufferedImage image = new BufferedImage(100, 45, BufferedImage.TYPE_INT_RGB);
		// 生成画笔
		Graphics g = image.getGraphics();
		// 把生成的图片背景色为淡灰色的
		g.setColor(Color.GRAY.brighter());
		g.fillRect(0, 0, image.getWidth(), image.getHeight());
		//验证码字符的大小
		Font f = new Font("IMPACT", Font.ITALIC, 30);
		g.setFont(f);
		for (int i = 0; i < code.length(); i++) {
			int y = 25;
			g.setColor(Color.black);
			g.drawString("" + code.charAt(i), image.getWidth() / code.length()* i, y);
		}
		ImageIO.write(image, "png", response.getOutputStream());
	}

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

}

 验证码使用:

package com.wang;

import java.io.IOException;

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

public class YanZhengTest extends HttpServlet implements Servlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response){
		
		HttpSession session = request.getSession();
		
		String yz = (String)request.getParameter("YZtext");
		
		String yzC = (String)session.getAttribute("YanZheng"); 
		//这样每次用完之后都清空一下session,防止验证码session攻击
		session.removeAttribute("YanZheng");
		
		if( yz.equals(yzC)){
			System.out.println("true");
		} else {
			System.out.println("false");
		}
		
		try {
			response.sendRedirect("index.jsp");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	protected void doPost(HttpServletRequest requset,
			HttpServletResponse response) throws ServletException, IOException {
		doGet(requset, response);
	}

	
	
}

 

 

 

 

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

相关推荐

    php高安全验证码生成类

    在生成验证码时,我们可以使用GD库的`imagecreatetruecolor()`函数创建一个真彩色图像,然后通过`imagecolorallocate()`分配颜色,`imagestring()`或`imagettftext()`函数写入文字。 - ImageMagick库则提供更强大的...

    验证码生成类大全

    验证码生成类大全是一种用于网络安全验证的重要工具,它主要用于防止恶意自动化程序(如机器人)进行非法操作,例如批量注册、刷票或数据抓取。在Web应用中,验证码通常需要用户在提交表单前输入图像上显示的一串...

    php验证码生成与使用

    一个页面产生随机码的图形,一个登录页面进行调用,其中验证码的值用一个全局session变量保存,登录页面进行验证码输入判断。

    java验证码生成类

    这篇博客文章“java验证码生成类”提供了一个简单的示例,下面我们将深入探讨验证码生成的相关知识点。 首先,验证码的基本原理是生成一段随机的、难以由机器识别的文字或数字序列,然后要求用户在限定时间内输入这...

    一个php验证码生成类代码.zip

    验证码(CAPTCHA)是一种用于验证用户是否为人类的机制,常用于防止自动化...总的来说,这个PHP验证码生成类提供了一种简洁高效的方式来创建安全的图像验证码,可以广泛应用于各种Web应用中,保护网站免受自动化攻击。

    验证码的生成与校验

    生成验证码的Servlet通常会创建一个包含随机字符的图像,这些字符对人类用户来说可读,但对计算机程序来说难以识别。下面是生成验证码的基本步骤: 1. **生成随机字符串**:首先,我们需要创建一个包含数字和字母的...

    验证码的session问题

    在Web应用中,当用户请求验证码时,服务器会生成验证码并将其存储在Session中,同时将验证码的ID(通常是一个唯一的Session ID)发送给客户端,通常以Cookie的形式。客户端在填写验证码后,将验证码ID和用户输入的...

    .net 生成验证码 代码 页面

    .NET框架提供了一种高效的方法来生成验证码,以增强网站的安全性,防止自动化脚本或机器人进行非法操作。验证码(CAPTCHA)是一种通过图形图像显示随机字符的技术,要求用户手动输入这些字符以证明他们是人类,而...

    ajax验证码 验证码ajax 生成中文验证码

    1. **服务器端生成验证码**:服务器上需要有一个生成验证码的逻辑,这通常涉及到随机生成一组中文字符或数字,然后将其存储到服务器会话(session)或者Cookie中,以供后续验证使用。 2. **Ajax请求**:当用户触发...

    asp.net验证码生成类

    ASP.NET验证码生成类主要用于在Web应用中创建安全的随机字符序列,用于验证用户输入是否有效,防止自动机器人或恶意程序的攻击。此类通常包括几个关键功能,如生成验证码字符串、创建验证码图片以及处理相关的安全...

    页面随机验证码生成

    本项目着重于JSP页面上的验证码生成,结合后台Java代码,提供了一个完整的解决方案。 首先,验证码的核心在于其随机性和不可预测性。在JSP页面上,通常会有一个专门的图片元素显示验证码。这个图片是由服务器动态...

    java jcaptcha 验证码 生成

    Java JCaptcha验证码生成详解 验证码(CAPTCHA)是一种防止机器自动操作的安全机制,它通过让用户输入图片或音频中显示的随机字符来验证用户是否为真实的人。在Java开发中,JCaptcha是一个广泛使用的开源库,它提供...

    验证码生成 判断

    验证码生成与判断是Web开发中常见的一种安全机制,主要用于防止自动化程序(如机器人)进行非法操作,例如批量注册、恶意登录等。在这个项目中,"验证码生成 判断" 涉及到的主要知识点包括验证码的生成逻辑、图像...

    jsp随机验证码生成测试

    本项目“jsp随机验证码生成测试”提供了一个基于Java Server Pages (JSP) 实现的验证码生成实例,旨在帮助开发者理解和实践如何在Web应用程序中集成验证码功能。 验证码的主要目的是验证用户是人而不是计算机程序。...

    用session做验证码

    2. 图形处理:使用PHP的GD库或其他图像库生成验证码图片。 3. 随机函数:生成随机验证码字符串,例如`rand()`或`random_string()`。 4. 表单提交与验证:处理用户提交的验证码,与session中的验证码进行比较。 5. ...

    C# 如何自动生成验证码(Web图形验证码生成示例),相信好多人有要用哦(源码)

    在C#编程中,生成验证码是一项常见的任务,主要用于防止机器人或恶意软件自动填充表单,保护网站的安全性。本文将详细介绍如何使用C#自动生成Web图形验证码,以及提供一个简单的5位数字验证码生成示例。 首先,理解...

    Struts2的验证码生成

    另外,还需要一个图像处理库,如Java的Java Advanced Imaging (JAI) 或者更简单的如jjwt-aptcha库,专门用于生成验证码图片。 2. **配置Struts2**:在Struts2的配置文件(struts.xml)中,我们需要定义一个Action,...

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

    本项目提供了生成验证码的功能,并且在Java后台处理了验证码的验证过程,确保用户输入的验证码与系统生成的一致。下面将详细解释相关知识点。 1. **验证码生成**: - **随机数生成**:验证码通常由一系列随机数字...

    验证码的生成,如何随机生成验证码

    这与我们生成验证码的过程相反,通常用于学术研究或自动化测试。 总结来说,创建一个区分大小写的ASP.NET验证码涉及随机字符串生成、图形化表示以及服务器端和客户端的交互。理解和实现这个过程对于提升网站安全性...

    验证码生成jsp 代码

    在本主题中,我们主要关注的是如何在Java服务器页面(JSP)中生成验证码。JSP是Java Web开发中的一个重要组件,它允许开发者将动态内容嵌入到HTML页面中。 验证码生成的流程通常包括以下几个步骤: 1. **生成随机...

Global site tag (gtag.js) - Google Analytics