java通过Servlet生成验证码

原创 2015年11月20日 15:52:41
实体类具体写法
package com.han.model;

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

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

public class ValidateCodeServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2376992603034716655L;
	private final Font mFont = new Font("Arial Black", Font.PLAIN, 15); // 设置字体
	private final int lineWidth = 2; // 干扰线的长度=1.414*lineWidth
	private final int width = 88; // 定义图形大小
	private final int height = 25; // 定义图形大小
	private final int count = 200;

	/**
	 * 描述:
	 * 
	 * @param fc
	 *            描述:
	 * @param bc
	 *            描述:
	 * 
	 * @return 描述:
	 */
	private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色

		final Random random = new Random();

		if (fc > 255) {

			fc = 255;
		}

		if (bc > 255) {

			bc = 255;
		}

		final int r = fc + random.nextInt(bc - fc);
		final int g = fc + random.nextInt(bc - fc);
		final int b = fc + random.nextInt(bc - fc);

		return new Color(r, g, b);
	}

	// 处理post
	@Override
	public void doPost(final HttpServletRequest request,
			final HttpServletResponse response) throws ServletException,
			IOException {

		doGet(request, response);
	}

	/**
	 * 描述:
	 * 
	 * @param request
	 *            描述:
	 * @param response
	 *            描述:
	 * 
	 * @throws ServletException
	 *             描述:
	 * @throws IOException
	 *             描述:
	 */
	@Override
	public void doGet(final HttpServletRequest request,
			final HttpServletResponse response) throws ServletException,
			IOException {
		 response.reset();
		// 设置页面不缓存
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/gif");
		// 在内存中创建图象
		final BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);

		// 获取图形上下文
		final Graphics2D g = (Graphics2D) image.getGraphics();

		// 生成随机类
		final Random random = new Random();

		// 设定背景色
		g.setColor(getRandColor(200, 250)); // ---1

		g.fillRect(0, 0, width, height);

		// 设定字体
		g.setFont(mFont);

		// 画边框
		g.setColor(getRandColor(0, 20)); // ---2
		
		//距离
		g.drawRect(0, 0, width -1, height - 1);

		// 随机产生干扰线,使图象中的认证码不易被其它程序探测到
		for (int i = 0; i < count; i++) {

			g.setColor(getRandColor(150, 200)); // ---3

			final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
			final int y = random.nextInt(height - lineWidth - 1) + 1;
			final int xl = random.nextInt(lineWidth);
			final int yl = random.nextInt(lineWidth);
			g.drawLine(x, y, x + xl, y + yl);
		}

		// 取随机产生的认证码(4位数字)
		String sRand = "";

		for (int i = 0; i < 4; i++) {

			final String rand = String.valueOf(random.nextInt(10));
			sRand += rand;

			// 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
			g.setColor(new Color(20 + random.nextInt(130), 20 + random
					.nextInt(130), 20 + random.nextInt(130))); // --4--50-100
            //第一个参数是要画上去的字符串    后面两个参数是针对 (0,0) x轴和y轴
			g.drawString(rand, (13 * i) + 10, 20);

		}

		// 将认证码存入SESSION
		request.getSession().setAttribute("validateCode", sRand);

		// 图象生效 
        //它的作用是销毁程序中指定的图形界面资源,如果在使用了graphics获得windows一些图形资源,而不进行关闭的话,由于后期多人使用就会造成内存溢出的情况的,导致程序卡死。
		g.dispose();
		final java.io.OutputStream os = response.getOutputStream();
		// 输出图象到页面
		ImageIO.write(image, "PNG", os);
		os.flush();
		os.close();

	}
}

web.xml文件的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>ValidateCodeServlet</servlet-name>
    <servlet-class>com.han.model.ValidateCodeServlet</servlet-class>
     <init-param> 
	<param-name>width</param-name> 
	<param-value>200</param-value> 
	</init-param> 
	<init-param> 
	<param-name>height</param-name> 
	<param-value>80</param-value> 
	</init-param> 
	<init-param> 
	<param-name>codeCount</param-name> 
	<param-value>5</param-value> 
	</init-param> 
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateCodeServlet</servlet-name>
    <url-pattern>/ValidateCodeServlet</url-pattern>
  </servlet-mapping>
</web-app>

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>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">
	-->
  </head>
  
  <body>
    验证码:<img src="ValidateCodeServlet"  class="img-rounded" onclick="this.src='ValidateCodeServlet?'+Math.random();" />
  </body>
</html>


菜鸟学Java(六)——简单验证码生成(Java版)

验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字、字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素...
  • liushuijinger
  • liushuijinger
  • 2013年07月26日 10:29
  • 43139

Java生成验证码并进行验证

一、实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证 最后通过Image...
  • worm0527
  • worm0527
  • 2016年04月06日 22:11
  • 15589

Java生成图片验证码(有点仿QQ验证码的意思)

看了挺多图片验证码的代码,感觉没什么长的好看点的,就自己动手写了个,写完发现跟QQ的有几分相似,比较满意。 功能包括:自定义图片尺寸和字符长度,随机背景颜色和字符颜色,随机字符偏移角度,字符平滑边缘,...
  • ruixue0117
  • ruixue0117
  • 2014年04月02日 23:32
  • 64102

JAVA生成验证码

原理:页面端通过定义img的src直接请求到服务器端,服务器端生成验证码图片,保存验证码值,并将图片通过流的方式返回到页面端。 生成验证码图片:通过java绘制2D图片。下面代码:/** * 随...
  • zyujie
  • zyujie
  • 2014年12月12日 17:29
  • 1179

java图形验证码生成工具类及web页面校验验证码

java图形验证码生成工具类及web页面校验验证码
  • zhulin40
  • zhulin40
  • 2016年07月13日 16:59
  • 15019

JavaWEB小知识学习--验证码生成

验证码是现在必不可少的一个小功能,可以放爆破,防垃圾请求,总之还是有一定约束力的SpringMVC实现验证码功能主要是提供一个URL请求,该请求对应的方法可以生成一张验证码图片,然后把该验证码数值存入...
  • u012706811
  • u012706811
  • 2016年07月14日 20:10
  • 8338

java后台产生验证码后台验证

直接跳severlet在java后台生成验证码:@RequestMapping(value="yzm.action") public void Yzm(HttpSession session,Htt...
  • sinat_32133675
  • sinat_32133675
  • 2017年08月16日 14:58
  • 950

java web项目生成验证码的解决方案

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。 作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317...
  • ch656409110
  • ch656409110
  • 2013年10月09日 22:29
  • 11622

java生成图片验证码显示在页面上

java类: import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.im...
  • heweimingming
  • heweimingming
  • 2015年07月15日 01:27
  • 2442

Java 生成验证码

Java 生成验证码
  • shuiCSDN
  • shuiCSDN
  • 2017年05月20日 10:28
  • 269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java通过Servlet生成验证码
举报原因:
原因补充:

(最多只允许输入30个字)