- 浏览: 739291 次
- 性别:
- 来自: 湖北
文章分类
最新评论
-
SE_XiaoFeng:
用mysqldump命令行导出。这个报错唉。错误提示信息如下: ...
linux下如何导入导出MySQL数据库 -
SE_XiaoFeng:
文章写的干脆了当,我喜欢!
linux下如何导入导出MySQL数据库 -
niky6688:
网站咋打不开呢
beckham herms birki ...
【原创】上周给公司新做了一个网站,请大家审阅! -
niky6688:
哈哈
new chanel bags 2012
burbe ...
今天我抢了一个咪咪??? -
ydsakyclguozi:
...
jsp资源管理器也可能是木马
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.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM
*
* @author Yuan
* 验证码生成器,使用此类需要将表单里的验证码输入框的name属性设为"verifycode"
*/
public class VerifyCodeGenerator {
private static final VerifyCodeGenerator generator = new VerifyCodeGenerator();
private final String ATTRIBUTE_NAME = "verifycode";
//图片的宽度
private final int WIDTH = 15;
//图片的高度
private final int HEIGHT = 22;
//字符串长度
private final int CODE_LENGTH = 4;
//随机字符串范围
private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "1234567890"
+ "@#quot;;
private final char[] CHARS = RAND_RANGE.toCharArray();
private Random random = new Random();
private VerifyCodeGenerator(){
//
}
public static VerifyCodeGenerator getInstance(){
return generator;
}
/**
* 生成随机字符串
* @return 随机字符串
*/
private String getRandString(){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < CODE_LENGTH; i++)
sb.append(CHARS[random.nextInt(CHARS.length)]);
return sb.toString();
}
/**
* 生成随机颜色
* @param ll 产生颜色值下限(lower limit)
* @param ul 产生颜色值上限(upper limit)
* @return 生成的随机颜色对象
*/
private Color getRandColor(int ll, int ul){
if (ll > 255) ll = 255;
if (ll < 1) ll = 1;
if (ul > 255) ul = 255;
if (ul < 1) ul = 1;
if (ul == ll) ul = ll + 1;
int r = random.nextInt(ul - ll) + ll;
int g = random.nextInt(ul - ll) + ll;
int b = random.nextInt(ul - ll) + ll;
Color color = new Color(r,g,b);
return color;
}
/**
* 生成指定字符串的图像数据
* @param verifyCode 即将被打印的随机字符串
* @return 生成的图像数据
* */
private BufferedImage getImage(String verifyCode){
BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics graphics = image.getGraphics();
//设置背景色
graphics.setColor(getRandColor(1,50));
//填充背景色
graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);
//设置边框颜色
graphics.setColor(new Color(0,255,0));
//画边框
for (int i=0; i<2; i++)
graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1);
//设置随机干扰线条颜色
graphics.setColor(getRandColor(50,100));
//产生50条干扰线条
for (int i=0; i<50; i++){
int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;
int y1 = random.nextInt(HEIGHT - 4) + 2;
int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;
int y2 = y1;
graphics.drawLine(x1, y1, x2, y2);
}
//设置字体
graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//画字符串
for (int i=0; i<this.CODE_LENGTH; i++){
String temp = verifyCode.substring(i, i+1);
graphics.setColor(getRandColor(100,255));
graphics.drawString(temp, 13 * i + 6, 16);
}
//图像生效
graphics.dispose();
return image;
}
/**
* 将验证码的图像输出
* @param request 用户的请求对象
* @param response 用户的响应对象
* */
public void printImage(HttpServletRequest request,
HttpServletResponse response){
//将ContentType设为"image/jpeg",让浏览器识别图像格式。
response.setContentType("image/jpeg");
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 2000);
//获得随机验证码
String verifyCode = this.getRandString();
String str = "ssss";
for(int i=0; i<10; i++)
str = str + str;
//获得验证码的图像数据
BufferedImage bi = this.getImage(verifyCode);
//把验证码存入session
request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);
try{
//获得Servlet输出流
ServletOutputStream outStream = response.getOutputStream();
//创建可用来将图像数据编码为JPEG数据流的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
//将图像数据进行编码
encoder.encode(bi);
//强行将缓冲区的内容输入到页面
outStream.flush();
//关闭输出流
outStream.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
/**
* 检查输入的验证码是否正确,若用户输入的验证码与生成的验证码相符则返回true,否则返回false。
* @param request 用户的请求对象
* @return 验证结果
* */
public boolean check(HttpServletRequest request){
if (((String)request.getParameter(ATTRIBUTE_NAME))
.equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){
request.getSession().removeAttribute(ATTRIBUTE_NAME);
return true;
}
return false;
}
}
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* @(#)VerifyCodeServlet.java Dec 9, 2007 8:14:14 PM
*
* @author Yuan
* 验证码生成器,使用此类需要将表单里的验证码输入框的name属性设为"verifycode"
*/
public class VerifyCodeGenerator {
private static final VerifyCodeGenerator generator = new VerifyCodeGenerator();
private final String ATTRIBUTE_NAME = "verifycode";
//图片的宽度
private final int WIDTH = 15;
//图片的高度
private final int HEIGHT = 22;
//字符串长度
private final int CODE_LENGTH = 4;
//随机字符串范围
private final String RAND_RANGE = "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "1234567890"
+ "@#quot;;
private final char[] CHARS = RAND_RANGE.toCharArray();
private Random random = new Random();
private VerifyCodeGenerator(){
//
}
public static VerifyCodeGenerator getInstance(){
return generator;
}
/**
* 生成随机字符串
* @return 随机字符串
*/
private String getRandString(){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < CODE_LENGTH; i++)
sb.append(CHARS[random.nextInt(CHARS.length)]);
return sb.toString();
}
/**
* 生成随机颜色
* @param ll 产生颜色值下限(lower limit)
* @param ul 产生颜色值上限(upper limit)
* @return 生成的随机颜色对象
*/
private Color getRandColor(int ll, int ul){
if (ll > 255) ll = 255;
if (ll < 1) ll = 1;
if (ul > 255) ul = 255;
if (ul < 1) ul = 1;
if (ul == ll) ul = ll + 1;
int r = random.nextInt(ul - ll) + ll;
int g = random.nextInt(ul - ll) + ll;
int b = random.nextInt(ul - ll) + ll;
Color color = new Color(r,g,b);
return color;
}
/**
* 生成指定字符串的图像数据
* @param verifyCode 即将被打印的随机字符串
* @return 生成的图像数据
* */
private BufferedImage getImage(String verifyCode){
BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//获取图形上下文
Graphics graphics = image.getGraphics();
//设置背景色
graphics.setColor(getRandColor(1,50));
//填充背景色
graphics.fillRect(0, 0, WIDTH * 4, HEIGHT);
//设置边框颜色
graphics.setColor(new Color(0,255,0));
//画边框
for (int i=0; i<2; i++)
graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1);
//设置随机干扰线条颜色
graphics.setColor(getRandColor(50,100));
//产生50条干扰线条
for (int i=0; i<50; i++){
int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2;
int y1 = random.nextInt(HEIGHT - 4) + 2;
int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1;
int y2 = y1;
graphics.drawLine(x1, y1, x2, y2);
}
//设置字体
graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18));
//画字符串
for (int i=0; i<this.CODE_LENGTH; i++){
String temp = verifyCode.substring(i, i+1);
graphics.setColor(getRandColor(100,255));
graphics.drawString(temp, 13 * i + 6, 16);
}
//图像生效
graphics.dispose();
return image;
}
/**
* 将验证码的图像输出
* @param request 用户的请求对象
* @param response 用户的响应对象
* */
public void printImage(HttpServletRequest request,
HttpServletResponse response){
//将ContentType设为"image/jpeg",让浏览器识别图像格式。
response.setContentType("image/jpeg");
//设置页面不缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 2000);
//获得随机验证码
String verifyCode = this.getRandString();
String str = "ssss";
for(int i=0; i<10; i++)
str = str + str;
//获得验证码的图像数据
BufferedImage bi = this.getImage(verifyCode);
//把验证码存入session
request.getSession().setAttribute(ATTRIBUTE_NAME, verifyCode);
try{
//获得Servlet输出流
ServletOutputStream outStream = response.getOutputStream();
//创建可用来将图像数据编码为JPEG数据流的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream);
//将图像数据进行编码
encoder.encode(bi);
//强行将缓冲区的内容输入到页面
outStream.flush();
//关闭输出流
outStream.close();
}catch(IOException ex){
ex.printStackTrace();
}
}
/**
* 检查输入的验证码是否正确,若用户输入的验证码与生成的验证码相符则返回true,否则返回false。
* @param request 用户的请求对象
* @return 验证结果
* */
public boolean check(HttpServletRequest request){
if (((String)request.getParameter(ATTRIBUTE_NAME))
.equalsIgnoreCase((String)request.getSession().getAttribute(ATTRIBUTE_NAME))){
request.getSession().removeAttribute(ATTRIBUTE_NAME);
return true;
}
return false;
}
}
发表评论
-
属性文件的读取 Java
2010-12-11 08:51 1199import java.util.ResourceBu ... -
【精华】Java项目生成静态页面
2010-12-11 08:47 1248需转载,请注明转载出处!本文地址: http://blog. ... -
【珍藏版】微软等数据结构+算法面试100题全部出炉[100题首次完整亮相]
2010-12-06 16:33 2888转至: http://blog.csdn.net/v_JULY ... -
【原创】Log4j 日志文件 使用
2010-12-02 11:37 1232log4j.properties 代码 log4j.ro ... -
【精华】保护自己的网站资源
2010-11-19 08:03 1206禁止用“另存为”保存页面 <head> < ... -
【精华】Window.Open()网页弹出窗口大全
2010-11-16 18:01 1571【1、最基本的弹出窗口代码】 <!--<br ... -
【精华】页面右下角弹出类似QQ或MSN的消息提示
2010-11-05 16:36 1034具体实现见 附件 主要是 针对 在框架中 如何实现 后下 ... -
【原创】苦恼了1个星期的DIV 滚动条置底, 今天终于实现了!!!
2010-11-05 10:58 3446<script type="text/ja ... -
【急救......】Could not find the main class.program will exit
2010-11-01 17:23 1636Java中Could not find the main cl ... -
屏蔽 F5 刷新键
2010-10-28 11:09 795<script language="JavaS ... -
web页面中按ESC关闭窗口
2010-10-28 11:04 1414<script language="jav ... -
web页面中如果想让用户复制页面内容粘贴时加入一些自定义信息
2010-10-28 11:04 859如果让用户复制你网站上的信息到别处粘贴时,附加自定义信息可以采 ... -
防止页面被多次提交
2010-10-28 11:03 18951. javascript ,设置一个变量,只允许提交一 ... -
Javascript打印代码
2010-10-18 14:38 903Javascript打印代码 实现打印功能的javasc ... -
【原创】struts+mysql+jsp 分页源码
2010-09-16 10:42 941具体代码见附件 一起学习,xf.zhouwenjun@163 ... -
【原创】struts 动态 设置radio 与 select 的默认值
2010-08-06 13:10 1650运行效果见 附件,有好的解决方法请分享xf.zhouwenju ... -
【原创】平时编码中积累的,非常好用,且很全的【时间工具类】
2010-07-21 17:42 909具体java类 请下载附件!烦请大家一起完善完善,请给我也分享 ... -
【原创】苦苦寻找的: ajax 定时读取数据,无刷新在页面显示
2010-07-19 17:17 1057demo 见附件 -
【绝】在web工程下 调用js 日历控件 报错【missing ( before function parameters)
2010-07-09 11:28 1134报错代码 function document.onclick( ... -
【精髓】非常好用的日历控件,可以自由的选择日期 时分秒
2010-07-09 10:57 17531、Calendar.js代码如下 省略! 具体内容 ...
相关推荐
Java使用Servlet实现登录验证码涉及到的是Web开发中的安全性与用户体验部分。验证码是一种常用的安全机制,用于防止自动化的机器人或恶意程序进行非法操作,如批量注册、恶意登录等。在这个例子中,我们将探讨两种...
Servlet在服务器端运行,其生命周期包括加载、初始化、服务、销毁四个阶段。当服务器启动或第一次接收到对Servlet的请求时,Servlet被加载并初始化。然后,每次接收到请求,Servlet都会调用`service()`方法来处理...
总之,Java验证码的实现涉及图像处理、随机数生成、会话管理等多个Java技术,是Web开发中不可或缺的安全组件。在实际项目中,开发者需要根据需求选择合适的验证码类型,并优化其性能和用户体验。
- 提供简单的示例或使用指南,说明如何在项目中集成这个验证码生成器。 综上所述,本示例提供了从生成随机字符串到绘制图像的完整验证码解决方案,并且允许定制验证码的类型(数字、英文、中文)和长度。通过学习...
总结,使用Servlet实现动态验证码涉及到图像处理、随机字符串生成、HTTP响应的构建和会话管理等多个技术点。理解这些原理并结合实际应用,可以帮助开发者创建出安全、有效的验证码系统,提高Web应用的安全性。
基于Servlet实现的验证码验证是将验证码生成和验证过程集成到服务器端的一种方法,尤其适用于使用Java语言开发的SSH(Spring、Struts和Hibernate)项目。SSH框架提供了模型-视图-控制器(MVC)的架构,使得验证码...
对于Kaptcha,这个文件可能会解释如何将库导入到项目中,以及如何配置和调用验证码生成器。 `kaptcha.war` 文件是Web应用程序的归档文件,通常用于部署在Servlet容器(如Tomcat)中。这意味着Kaptcha库也可以直接...
Servlet是Java服务器端编程的重要组件,可以用来处理HTTP请求并生成响应。本教程将深入讲解如何使用Servlet生成随机验证码。 首先,让我们了解Servlet的基本概念。Servlet是一个Java类,遵循Servlet API规范,它被...
Java验证码生成库JCaptcha是一个强大的安全工具,用于创建和验证在Web应用中广泛使用的图形验证码。验证码的主要目的是防止自动化的机器人或恶意脚本执行非法操作,例如注册虚假账户、发送垃圾邮件或者进行其他非...
3. **Servlet处理请求**:Servlet接收到更换验证码的请求后,生成新的验证码字符串,更新服务器端的验证码状态,并且创建新的验证码图像。 4. **返回新验证码**:Servlet将新生成的验证码图像作为响应返回,可以以...
下面我们将详细探讨如何使用Java实现一个简单的验证码生成器,以及在Servlet中应用这个生成器。 首先,我们需要创建一个Servlet来处理验证码的生成。在给定的代码中,`ValidateCodeServlet` 是一个继承自 `...
3. **存储验证码**:将生成的验证码保存在服务器端,常用的方式是放在HttpSession中,与用户的会话关联。 4. **展示验证码**:将图像发送给客户端,可以通过HTTP响应的`Set-Cookie`头或者将验证码作为参数拼接在URL...
2. **生成验证码**:通常使用随机数生成器创建4位或6位数字验证码,并存储在服务器端,如session中,以便后续验证。 3. **安全性考虑**:为了防止恶意攻击,可以设置每个手机号的发送频率限制,以及验证码的有效时间...
以上就是使用Servlet实现验证码的基本步骤。需要注意的是,这只是一个基础实现,实际应用中可能需要考虑更多安全因素,例如增加更多的字符集、使用更复杂的干扰线、考虑可访问性(如为视觉障碍者提供声音验证码)等...
1. Servlet 技术:Servlet 是一种服务器端的 Java 技术,可以用于生成动态的 Web 内容。 2. 验证码技术:验证码是一种安全机制,用于防止机器人和恶意软件攻击。 3. Java graphics 和 image 处理:Java 提供了 ...
1. 生成验证码:生成随机字符串,并将其保存在服务器端的session中。 2. 显示验证码:将生成的验证码以图像形式显示在网页上。 3. 用户输入验证:用户输入验证码后,服务器端比较输入值与session中保存的值,若一致...
首先,我们需要创建一个验证码生成器。这个生成器通常会随机生成一串字符,然后将其图像化。在Java中,我们可以使用Java的`java.awt`和`javax.imageio`库来创建和保存图像。以下是一个简单的验证码生成器的示例: `...
1. **Servlet**:用于处理HTTP请求,生成验证码图片,并将其存储在服务器端的会话(session)中。 2. **Java图形库**:例如Java AWT或Swing,用于绘制随机字符、线条、噪音等,创建独一无二的验证码图片。 3. **HTTP...
本项目使用了JSP(JavaServer Pages)和Servlet技术来实现,同时集成了验证码功能,增强了安全性,防止恶意的自动提交。 1. JSP基础:JSP是一种动态网页技术,允许开发者将Java代码嵌入HTML或XML文档中,从而在...
行为验证码是一种用于验证用户是否为真实人类的网络安全技术,它通过要求用户执行特定的动作来完成验证,例如滑动拼图或点选特定的文字。这种验证码相比传统的文本输入验证码,更能防止自动化程序(如机器人)的攻击...