图形验证码one

Servlet形式的图形验证码

servlet代码如下:

package com.common.web.servlet.verifycode;

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.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 com.io.hw.awt.color.CustomColor;
import com.string.widget.util.ValueWidget;
/***
 * 生成验证码
 * <br>需要在web.xml中配置servlet才能访问
 * <br>
 * <code><servlet>
		<servlet-name>imageVerifyCode</servlet-name>
		<servlet-class>com.common.web.servlet.verifycode.RandomCodeServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>imageVerifyCode</servlet-name>
		<url-pattern>/imageVerifyCode</url-pattern>
	</servlet-mapping></code>
 * @author huangwei
 * @since 20140424
 */
public class RandomCodeServlet extends HttpServlet {

	private static final long serialVersionUID = 2040832365570046619L;
	private int width = 60, height = 20;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String picFormat=request.getParameter("picFormat");
		// 在内存中创建图象
		BufferedImage img = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		// 获取图形上下文
		Graphics g = img.getGraphics();
		// 设定背景色
		g.setColor(Color.WHITE);

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

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

		// 设定字体
		Font f = new Font("Times New Roman", Font.PLAIN, 18);
		g.setFont(f);

		// 画边框
		g.setColor(Color.BLACK);
		g.drawRect(0, 0, width - 1, height - 1);

//		g.setColor(Color.GRAY);

		// 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到
		for (int i = 0; i < 160; i++) {
			g.setColor(CustomColor.getLightColor());
			int x = r.nextInt(width);
			int y = r.nextInt(height);
			int x1 = r.nextInt(12);
			int y1 = r.nextInt(12);
			g.drawLine(x, y, x + x1, y + y1);
		}

		StringBuffer sb = new StringBuffer();
		int red = 0, green = 0, blue = 0;

		// 取随机产生的认证码(4位数字)
		for (int i = 0; i < 4; i++) {
			String strRand = String.valueOf(r.nextInt(10));

			red = r.nextInt(110);
			green = r.nextInt(50);
			blue = r.nextInt(50);

			// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
			g.setColor(new Color(red, green, blue));

			// 将认证码显示到图象中
			g.drawString(strRand, 13 * i + 6, 16);
			sb.append(strRand);
		}

		HttpSession session = request.getSession();
		session.setAttribute("randomCode", sb.toString());

		// 设置页面不缓存
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		if(ValueWidget.isNullOrEmpty(picFormat)){
			picFormat="jpeg";
		}
		response.setContentType("image/"+picFormat);
//		System.out.println("verify code picFormat:"+picFormat);

		ServletOutputStream sos = response.getOutputStream();
		ImageIO.write(img, picFormat, sos);
		sos.close();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);
	}

}

依赖的类CustomColor:

package com.io.hw.awt.color;

import java.awt.Color;
import java.util.Random;

public class CustomColor {
    public  static Color red_little=new Color(255,200,200);
    public  static Color red_little_more=new Color(255,230,230);
    public static Color red_middle=new Color(255,100,100);
    public static Color blue_little_ocean=new Color(130,200,255);
    public static Color blue_little_gray=new Color(200,200,255);

	public static Color getColor(int r, int g, int b) {
		return new Color(r,g,b);
	}
	/***
	 *
	 * @param isLightColour : 浅色(亮色)
	 * @return
	 */
	public static Color getColor(boolean isLightColour){
	    int r = randomInt(isLightColour);
        int g = randomInt(isLightColour);
        int b = randomInt(isLightColour);
        while (r == 255 && g == 255 && b == 255)
        {
            r = randomInt(isLightColour);
            g = randomInt(isLightColour);
            b = randomInt(isLightColour);
        }
        return new Color(r, g, b);
	}
	public static Color getColor(){
		return getColor(false);
	}
	/***
	 * 获取
	 * @return
	 */
	public static Color getLightColor(){
        return getColor(true);
	}

	/***
	 *
	 * @param isLightColour : 是否浅色(亮色)
	 * @return
	 */
	public static int randomInt(boolean isLightColour) {
		Random dom = new Random();
		if(isLightColour){//浅色(亮色)
			int base=125;
			return dom.nextInt(base)+(255-base);
		}else{
			return dom.nextInt(255);
		}

	}
	public static int randomInt() {
		return randomInt(false/*isLightColour*/);
	}
	/***
	 * 浅色
	 * @return
	 */
	public static int randomIntLightColour() {
		return randomInt(true);
	}

	public static void main(String[] args) {
		System.out.println(randomInt());
		System.out.println(randomInt());
		System.out.println(randomInt());
	}

}

如何访问呢?

配置web.xml:

<servlet>
		<servlet-name>imageVerifyCode</servlet-name>
		<servlet-class>com.common.web.servlet.verifycode.RandomCodeServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>imageVerifyCode</servlet-name>
		<url-pattern>/imageVerifyCode</url-pattern>
	</servlet-mapping>
	

访问地址:

http://127.0.0.1:8080/tv_mobile/imageVerifyCode?picFormat=gif

时间: 2024-12-30 15:55:36

图形验证码one的相关文章

用JSP实现图形验证码

js|图形|验证码 import java.io.*; import java.util.*; import com.sun.image.codec.jpeg.*; import javax.servlet.*; import javax.servlet.http.*; import java.awt.*; import java.awt.image.*; public class ValidateCode  extends HttpServlet {  private Font mFont=n

JSP实现图形验证码-汉字

js|汉字|图形|验证码 <%@page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%> <%!  //create by smallnest  //email: smallnest@gmail.com  //website:www.kuaff.com  //生成随机颜色  Color getRandColor(R

技巧实例:jsp实现图形验证码

js|技巧|图形|验证码   调用方法       <img   src="http://...../getImg">           原理,在servlet中随机生成一个4位数字1000-9999然后把这数字写入session输出一个图片,上面写有这四个数字在服务器端根据用户输入的数字和 session中的值比较.   package   com.schoolwx.util;       import   java.io.*;       import   java.

自己写的一个图形验证码页面(Asp.Net2.0通过)

asp.net|图形|验证码|页面 项目需要,要在首页登录界面添加一个图形验证码,赶时髦吧,网上一搜,特别多,找了几个,都不太满意.主要问题是大部分代码生成的图片宽度不唯一,页面布局不容易控制,其次是颜色单一,有些又过于抽象,不仔细看很容易弄错.针对特定的客户,我只需要"图片"长宽固定,颜色多样的数字图形验证码,借鉴网上的现有代码,自己操刀完成,以下是效果图: 原理不复杂,就是把网页当画布,运用各色画笔,在特定区域内画出数字,然后以特定格式(本例为PNG格式)发回客户端,在IE中显示为

使用Asp.Net 2.0编写的图形验证码页面

项目需要,要在首页登录界面添加一个图形验证码,赶时髦吧,网上一搜, 特别多,找了几个,都不太满意.主要问题是大部分代码生成的图片宽度不唯一 ,页面布局不容易控制,其次是颜色单一,有些又过于抽象,不仔细看很容易弄 错.针对特定的客户,我只需要"图片"长宽固定,颜色多样的数字图形验证码 ,借鉴网上的现有代码,自己操刀完成,以下是效果图: 原理不复杂,就是把网页当画布,运用各色画笔,在特定区域内画出数字, 然后以特定格式(本例为PNG格式)发回客户端,在IE中显示为"图片"

PHP5中GD库生成图形验证码(有汉字)

本文为大家介绍下利用PHP5中GD库生成图形验证码而且带有汉字,具体的实现思路及代码如下,有需求的朋友可以参考下,希望对大家学习php有所帮助   利用PHP5中GD库生成图形验证码   类似于下面这样 1.利用GD库函数生成图片,并在图片上写指定字符 imagecreatetruecolor 新建一个真彩色图像 imagecolorallocate 为一幅图像分配颜色(调色板) imagestring 绘制字符 imageline 绘制线条 imagesetpixel 打像素点 2.输出图片

图形验证码最佳攻略2

下面是注册 如果是手机用户注册,需要发送短信验证码  说明: 发送图形验证码是为了拦截发送短信的.但是不拦截"注册帐号" 但是,用户体验很别扭,因为图形验证码很显然是错误的,但是却可以注册成功.  如果点击注册帐号 ,也要校验图形验证码,那就让用户输入两次图形验证码,显然不是很人性化 注意:注册时发送短信每次都需要输入图形验证码,而不是发送3次短信才要输入. 那么如何解决这个问题呢? 把注册拆分为两步: 第一步:发送短信验证码     第二步:设置密码和用户名   这样达到的目的: (

Web 图形验证码的校验1

网站开发中,就会经常涉及到图形验证码的校验,比如: 那么如何校验呢? 我们原来的校验方式:前后端都校验 步骤: (1)前端js 校验图形验证码的MD5 (2)校验通过才真正发送请求到服务器; (3)服务器再次校验图形验证码明文 注意:前端js校验的不是图形验证码明文,而是其MD5值;   如何获取图形验证码的MD5值呢? 服务器需要提供一个单独的接口,返回当前图形验证码的MD5.什么叫"当前"? 就是从session或redis中获取一个图形验证码,而不是重新生成.   后来我们修改了

搜狗浏览器官方宣布成功实现12306图形验证码自动识别

半月前,中国铁路客户服务中心(12306)推出了新版图形验证码,因为操作复杂且图片模糊,被网友吐槽为12306版"找你妹".今日,搜狗浏览器通过官方微博对外宣布,成功实现了12306图形验证码的自动识别,用户借此可以实现全自动抢票的体验.其也成为市面上首款.也是唯一一款实现了新版12306验证码自动识别的浏览器软件. 与以往的文字.数字验证输入不同,图片验证码的识别需要依赖多种判断逻辑才可完成,给用户购票过程增加了诸多困扰,其中不少难以辨认的"奇葩"图片更是增加了用