response生成图片验证码

标签: response 图片 验证码 | 发表时间:2011-12-25 23:54 | 作者:
出处:http://www.iteye.com
服务器对客户端浏览器做出的响应被封装成一个HttpResponse对象。要对浏览器进行操作,只需要操作HttpRespones对象,通过HttpServletResponse.getWriter()获得PrintWriter,该对象为outputStream的子类。然后使用该对象输出信息即可。
    本例将使用Servlet输出图片验证码。图片验证码的原理是,服务器生成一个包含随即的字符串图片发给客户端,客户端提交数据时需要填写字符串作为验证信息。由于字符串保存在图片里,因此机器很难识别,从而达到防止有人使用计算机程序恶意发送信息的目的。
   本贴由卡菲牛奶原创..如有意转载请注明文章来源于http://fuchangle.iteye.com

开始正文
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啦!


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [response 图片 验证码] 推荐:

response生成图片验证码

- - ITeye博客
服务器对客户端浏览器做出的响应被封装成一个HttpResponse对象. 要对浏览器进行操作,只需要操作HttpRespones对象,通过HttpServletResponse.getWriter()获得PrintWriter,该对象为outputStream的子类.     本例将使用Servlet输出图片验证码.

使用 PIL 生成验证码图片

- HarryHan - python.cn(jobs, news)
现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一. 这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码. _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z. _upper_cases = _letter_cases.upper() # 大写字母.

ZeroMQ(java)入门之Requerst/Response模式

- - CSDN博客架构设计推荐文章
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些分布式的环境下,可以极大的方便整个系统的实现. 在中间通过一个消息中间件,可以很方便的将各个woker的数据发送到最终的统计服务器来做数据的统计,从而减少很多在网络通信中会消耗的编程时间.

伯克利大学学生开发图片验证码Picatcha终结文字验证码CAPTCHA

- bamerl - 36氪
不知道朋友们会不会遇到,反正我会经常看不清楚一些安全验证码中的字母. Picatcha则打算用图片验证来击败过时而且难以分辨的CAPTCHA. 比如说某网站采用了Picatcha的解决方案,那么你在注册时就会看到选择图片验证. 一般情况是呈现给你8张图片,让你选出其中“带有一本书或者以上的所有图片”或者“一张CD或者以上的所有图片”等等.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

验证码新趋势:NuCaptcha推出动态验证码

- Mac.Baby - 36氪
曾开发过提供视频验证码服务的加拿大创业公司NuCaptcha刚刚发布了动态验证码,可为网站提供新的安全保证,有望为验证码市场带来新气象. 验证码是人们在网站上最常见的安全问题,只要是上网的人都会遇到被要求辨认和输入数字或者单词的情况. 网站通过验证码来区分人和恶意程序. 而我们所见的大部分的验证码都是基于文字的.

10种用户友好的验证码

- Liang - cnBeta.COM
众所周知,验证码就是帮助我们确定答案不是由电脑自己生成的. 今天我推荐给大家10种用户体验绝佳、令人意想不到的验证码设计风格.

验证码的现在与未来

- Yishen - 爱范儿 · Beats of Bits
”验证码“( CAPTCHA )其实并不是各位网友总是在不同网站上看到的难以辨认的字母组合的代名词,而是“全自动区分计算机和人类的图灵测试”的俗称,顾名思义,它的作用是区分计算机和人类. 在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答. 这个问题可以由计算机生成并评判,但是必须只有人类才能解答.

jsp+servlet实现验证码功能

- - CSDN博客推荐文章
验证码的功能大多数人可能不都理解,但几乎每个安全网站都会有. 验证码是用来防止非人为因素操作的行为,例如一个黑客要黑一个网站,怎么弄呢. 最简单的思路当然是造成其网路拥堵直至系统瘫痪掉. 如果没有验证码,那么我就可以在注册页面,写一个程序,只有注册表单,不断更换主键或不可重复的内容,不停的提交. 那这样每秒可以注册几万次都有可能,这样服务器就大量负载,很容易就瘫痪并死掉.

Servlet实现图形验证码

- - CSDN博客推荐文章
|-- 配置开发图形验证码Servlet. // 设置响应头 Content-type类型. // 以下三句是用于设置页面不缓存. // 建立指定宽、高和BufferedImage对象. Graphics g = image.getGraphics(); // 该画笔画在image上. Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场.