服务器对客户端浏览器做出的响应被封装成一个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
分享到:
相关推荐
生成图片验证码的过程分为以下几个步骤: 1. **随机字符生成**:验证码通常包含4到6个随机字符,这些字符可以是数字、大小写字母或其他符号。这些字符是通过Java的随机数生成器和字符集来创建的,确保每次请求时都...
在本主题“利用jsp生成图片验证码”中,我们将探讨如何在JavaServer Pages (JSP)上下文中创建一个简单的图片验证码,而无需使用Servlet。首先,我们要明白JSP是Java Web开发中的视图层技术,它允许我们在HTML页面中...
### ASP.NET生成图片验证码知识点详解 #### 一、概述 在Web应用开发中,验证码是一种常见的安全措施,用于区分操作者是人还是自动化程序。本文将详细介绍如何在ASP.NET环境中生成图片验证码,包括代码实现与关键...
Response.Write "<script>alert('验证码输入错误!');history.go(-1)</script>" Response.End Else Session("GetCode") = Empty ' 清空Session End If %> 调用页main.asp,点击图片更换验证码 ...
动态生成图片验证码的目的是防止自动化程序(如爬虫或恶意脚本)自动填写表单,从而提高网站的安全性。 在Servlet中生成图片验证码,首先需要创建一个Servlet类,该类将负责生成随机字符串并将其转化为图像。以下是...
"SpringMVC生成的验证码图片不显示问题及解决方法" 知识点1: SpringMVC验证码图片生成 在SpringMVC中,生成验证码图片需要使用@Controller注解的Controller类,通过@RequestMapping注解的方法来处理验证码图片的...
总结来说,使用JSP生成图片验证码涉及到以下几个关键点:生成随机字符串、存储验证码、绘制并输出图片以及设置HTTP响应类型。这种方法简单易用,但要注意,对于高级的自动化攻击,可能需要更复杂的验证码解决方案,...
在Java编程中,生成图片验证码是一项常见的安全措施,用于防止自动化程序(如机器人)对网站或应用程序进行恶意操作。验证码通常是一串随机字符,用户需要输入这些字符才能继续操作,例如注册、登录或提交表单。以下...
在这个特定的案例中,我们讨论的是如何使用JSP生成图片验证码,这是一种常见的安全机制,用于防止自动机器人或恶意用户进行非法操作。 验证码的主要目的是验证用户是否为真实的人,而不是机器。它通常是一串随机...
### JSP中利用Servlet生成验证码图片 在Web应用开发中,验证码被广泛应用于用户登录、表单提交等场景,以防止自动化的恶意攻击。本文将详细介绍如何在Java Server Pages (JSP) 和 Servlet 技术的基础上,实现一个...
使用google.kaptcha来生成图片验证码的实现方法 在本文中,我们将详细介绍如何使用google.kaptcha来生成图片验证码的实现方法。google.kaptcha是一个用于生成图片验证码的Java库,通过使用该库,可以轻松地生成图片...
### JSP页面验证码生成图片详解 #### 一、概述 在网站登录或注册过程中,为了防止恶意登录或机器人操作,通常会使用验证码机制。本文档详细介绍了一种利用JSP技术生成验证码图片的方法。该方法通过Java后端动态...
### 生成图片验证码知识点解析 #### 一、概述 在当今互联网应用中,为了防止恶意登录、表单提交等操作,图片验证码作为一种简单而有效的方法被广泛应用。本文将基于提供的文件信息来详细解析如何实现一个图片...
在Java开发中,生成动态GIF验证码是一种常见的安全机制,用于防止自动机器人或者恶意脚本对网站进行非法操作。这种验证码通常包含随机生成的字母、数字或者符号,以动画的形式展示,用户需要输入看到的验证码才能...
### ASP.NET 自动生成登录验证码(图片) #### 知识点概览 1. **ASP.NET 页面生命周期及事件处理** 2. **验证码生成原理** - 字符串生成 - 图像绘制 3. **图像处理技术** - 使用 `Graphics` 类 - 使用 `Bitmap` ...
在Web开发中,使用JSP(JavaServer Pages)来生成验证码图片是一种常见的方法。下面我们将详细讨论如何在JSP中实现验证码的生成。 首先,我们需要理解验证码的基本原理。验证码通常包含一串随机的字母和数字,有时...
验证码的主要目的是区分人类用户和自动化程序,通过要求用户输入图片上的文字或者完成简单的数学问题,来验证其为真实的人类。这有助于防止垃圾邮件、恶意注册、自动化攻击等网络安全问题。 二、Servlet简介 ...
`JSP`(JavaServer Pages)是Java的一种动态网页技术,可以用来生成图片验证码。下面我们将详细探讨如何在JSP中创建图片验证码以及验证用户输入的验证码是否正确。 ### 1. 图片验证码的生成原理 图片验证码的基本...
* 使用 BufferedImage 类来生成图片 * 使用 Graphics 对象来绘制图片 * 使用 Font 对象来设置字体 * 使用 Color 对象来设置字体颜色 * 使用 Random 对象来生成随机字符串 代码示例: ```java public void ...
HTML图片验证码组件是一种用于网络安全的身份验证机制,它通过在网页上显示一幅随机生成的图片,其中包含一组可读的字符,然后要求用户输入所见字符来确认他们不是自动化程序。这种技术广泛应用于防止机器人和自动...