`

response生成图片验证码

阅读更多
服务器对客户端浏览器做出的响应被封装成一个HttpResponse对象。要对浏览器进行操作,只需要操作HttpRespones对象,通过HttpServletResponse.getWriter()获得PrintWriter,该对象为outputStream的子类。然后使用该对象输出信息即可。
    本例将使用Servlet输出图片验证码。图片验证码的原理是,服务器生成一个包含随即的字符串图片发给客户端,客户端提交数据时需要填写字符串作为验证信息。由于字符串保存在图片里,因此机器很难识别,从而达到防止有人使用计算机程序恶意发送信息的目的。
   本帖由卡菲牛奶撰写,原文请访问http://fuchangle.iteye.com/blog/1325408
开始正文
Servlet输出图片时,需要调用getOutputStream输出图片,代码如下:
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.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class IdentityServlet extends HttpServlet{
	public static final char[] CHARS={'2','3','4','5','6','7','8','9','A','B','C',
		'D','E','F','G','H','K','M','L','N','L','X','Y','Z','Q'};
	public static Random random=new Random();
	
	public static String getRandomString(){
		StringBuffer buffer=new StringBuffer();
		//随即产生6位数
		for(int i=0;i<6;i++){
			buffer.append(CHARS[random.nextInt(CHARS.length)]);
		}
		System.out.println(buffer.toString());
		return buffer.toString();
	}
	//获取随即的颜色
	public static Color getRandomColor(){
		return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));
	}
	//返回某颜色的反色
	public static Color getReverseColor(Color c){
		return new Color(255-c.getRed(), 255-c.getGreen(),255-c.getBlue());
	}
	
	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("image/jpeg");
		
		String randomString=getRandomString();
		request.getSession(true).setAttribute("randomString", randomString);
		int width=100;//图片宽度
		int height=30;//图片高度
		
		Color color=getRandomColor();	//随即颜色。用于背景颜色
		Color reverse=getReverseColor(color);//反色,用于前背景
		//创建一个彩色图片
		BufferedImage bi=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//获取绘图对象
		Graphics2D g=bi.createGraphics();
		g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 16));//设置字体
		g.setColor(color);	//设置颜色
		g.fillRect(0, 0, width, height);//绘制背景
		g.setColor(reverse);//设置颜色
		g.drawString(randomString, 18, 20);
		
		for(int i=0;i<100;i++){
			g.drawRect(random.nextInt(width), random.nextInt(height),1, 1); //随即噪音点
		}
		
		ServletOutputStream out=response.getOutputStream();	//转换JPEG格式
		
		JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out); //编码器
		encoder.encode(bi);
		out.flush();	//输出到客户端
	}
	
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPost(req, resp);
	}
}


代码中利用一个随机数生成Random与char[]类型的字符字典生成随即字符串,字符字典里将比较容易混淆的0和O,1和I等都去掉,然后生成一个长100宽30的图片利用随即颜色填充背景,利用反色在前面绘制随即字符,并画出100个位置随即 的噪点,增加图片的识别难度

该Servlet需要配置到web.xml中,代码如下:
web.xml
  <servlet>
  		<servlet-name>IdentityServlet</servlet-name>
  		<servlet-class>com.fcl.IdentityServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  		<servlet-name>IdentityServlet</servlet-name>
  		<url-pattern>/servlet/IdentityServlet</url-pattern>
  </servlet-mapping>


然后访问该Servlet就可以预览图片啦。为了演示方面,下面用一个HTML文件引用这个图片验证码,代码如下:
   <script type="text/javascript">
		function reloadImage(){
			document.getElementById('btn').disabled=true;
			document.getElementById('identity').src='servlet/IdentityServlet?ts='+new Date().getTime();
		}
	
	</script>


     <body>
  		<img  src="servlet/IdentityServlet" id="identity" onload="btn.disabled=false;">
  		<input type="button" value="更换图片" onclick="reloadImage()" id="btn">
  </body>

这样就OK啦!
  • 大小: 25.8 KB
2
0
分享到:
评论

相关推荐

    response生成图片验证

    生成图片验证码原理是:随机生成一张图片,里面有一些随机字符,用户需要输入里面的验证字符,才能进入某一系统里面。本示例利用的是Servlet的response对象将生成的图片直接输出到了客户端的页面上。

    asp生成图片验证码类

    Response.Write "&lt;script&gt;alert('验证码输入错误!');history.go(-1)&lt;/script&gt;" Response.End Else Session("GetCode") = Empty ' 清空Session End If %&gt; 调用页main.asp,点击图片更换验证码 ...

    采用ajax实现的图片验证码

    生成图片中的文字: 1、先编写一个字符串,包含:数字,大小字母 private String s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 2、在产生背景之后,编写如下代码,产生四个字符...

    在JSP页面中动态生成图片验证码的方法实例

    在JSP页面中动态生成图片验证码 &lt;&#37;@ page language=java pageEncoding=UTF-8%&gt; &lt;&#37;@ page import=java.awt.*,java.awt.image.*,com.sun.image.codec.jpeg.*,java.util.* %&gt; &lt;&#37;@ taglib ...

    随机生成6位图片验证码

    随机生成6位图片验证码. /// /// PicHandler1 的摘要说明 /// public class PicHandler1 : IHttpHandler, IRequiresSessionState { private string mCheckNo = string.Empty; protected ImgBuilder _...

    JSP生成文字验证码

    //生成随机颜色 Color getRandColor(Random random, int fc, int bc) { if (fc &gt; 255) fc = 255; if (bc &gt; 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); ...

    ASP验证码组件ShotGraph

    大家经常在网上登陆的时候经常会看到让你输入验证码,有的是文字的,有的呢是图片,比如chinaren.com校友录中留言的时候,我们就会看到数字图片验证码;网上关于数字文字验证码实现方法的相关资料很多,而我们这里...

    asp.net验证码图片生成示例

    网站验证码是一种很常用的技术。下面我介绍下技术上是如何实现的

    ASP生成数字相加求和的BMP图片验证码

    目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输入一个相加后的和;如3+5=多少,这样的验证码新意倒有一些,不过...

    ASP留言本加验证码源文件

     在生成验证码图片的时候,同时生成了一个Session,其值就是验证码图片中的数字值。  同时,提供输入框让用户输入,提交输入值后,与已有的Session值进行比较,根据判断结果做相应判断。  如果需要修改Session...

    asp无组件生成验证码 GIF图片格式

    代码如下: &lt;&#37; Option Explicit ‘ 显示声明 Class Com_GifCode_Class ””””””””””””...Public Noisy, Count, Width, Height, Angle, Offset, Border Private Graph(), Margin(3) Private Sub Class_

    asp.net创建位图生成验证图片类(验证码类)

    代码如下:public void ProcessRequest(HttpContext context){context.Response.ContentType = “image/jpeg”;//创建位图,并且给指定边框的宽高using (Image img=new Bitmap(80,25)){ //创建画家对象,在img对象画...

    response_code.py

    一个基于python3.7编写的工具,主要实现功能为生成验证码图片

    基于SpringMVC annotation 的图形验证码

    // 指定生成的响应是图片 response.setContentType("image/jpeg"); int width = 200; int height = 60; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 创建...

    jsp页面验证码demo

    VerifyCodeUtils程序主要内容为通过java生成验证码的图片,以及验证码的value值,程序如下: package utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image....

    Java Web开发过程中登陆模块的验证码的实现方式总结

    验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某...

    c#实现验证码 源码

    //生成图片 private void GenImg(string code) { //定义一个画板 Bitmap myPalette = new Bitmap(60, 20); //在画板上定义绘图的实例 Graphics gh = Graphics.FromImage(myPalette); //定义一个矩形 ...

    Happy Captcha简易验证码-其他

    Happy Captcha简易验证码是一款易于使用的Java验证码软件包,旨在...在默认情况下,HappyCaptcha生成的验证码以图片形式展现,内容为09-az-A~Z的字符随机组合,字符长度为5,图片宽度为160,高度为50,字体为微软雅黑。

    Asp.net动态验证码

    /// 生成验证码图片 /// public void CreateCheckCodeImage() { #region string checkCode = GenerateCheckCode(); if (checkCode == null || checkCode.Trim() == String.Empty) return; System.Drawing...

    验证码下载jsp

    // 在内存中创建图象,设置图片的显示大小 int width=60, height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); ...

Global site tag (gtag.js) - Google Analytics