- 浏览: 277748 次
文章分类
最新评论
-
guji528:
oracle的统计函数真的很强大
Oracle 使用LAG和LEAD函数统计 -
haiyangyiba:
受教了
No Dialect mapping for JDBC type: 3 -
elvishehai:
能不能给个完整点的例子呀,我一直都没有试成功过,
简单的使用jackson的annotation -
miaoyue:
如果我想把name属性转成注释之后,之前的注释还在怎么做?
PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码 -
ianl_zt:
以上方法只适合在hibernate2中使用,现在hiberna ...
Hibernate的批量更新和删除
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.AttributedString;
import java.util.Random;
import javax.servlet.ServletException;
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 SimpleCaptcha extends HttpServlet {
private Random generator = new Random();
private final static String SIMPLE_CAPCHA_SESSION_KEY = "SIMPLE_CAPCHA_SESSION_KEY";
private static char[] captchars = new char[] { 'a', 'b', 'c', 'd', 'e',
'2', '3', '4', '5', '6', '7', '8', 'g', 'f', 'y', 'n', 'm', 'n',
'p', 'w', 'x' };
/**
* 产生随机字体
*
* @return
*/
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 45);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 45);
font[2] = new Font("Forte", Font.PLAIN, 45);
font[3] = new Font("Wide Latin", Font.PLAIN, 40);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 45);
return font[random.nextInt(5)];
}
/**
* 随机产生定义的颜色
*
* @return
*/
private Color getRandColor() {
Random random = new Random();
Color color[] = new Color[10];
color[0] = new Color(32, 158, 25);
color[1] = new Color(218, 42, 19);
color[2] = new Color(31, 75, 208);
return color[random.nextInt(3)];
}
/**
* @see javax.servlet.http.HttpServlet#void
* (javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int ImageWidth = 200;
int ImageHeight = 100;
int car = captchars.length - 1;
/**
* 产生随机字符串
*/
String test = "";
for (int i = 0; i < 4; i++) {
test += captchars[generator.nextInt(car) + 1];
}
/**
* 放放Session
*/
req.getSession().setAttribute(SimpleCaptcha.SIMPLE_CAPCHA_SESSION_KEY,
test);
/**
* 得到输出流
*/
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp
.getOutputStream());
BufferedImage bi = new BufferedImage(ImageWidth + 10, ImageHeight,
BufferedImage.TYPE_BYTE_INDEXED);
Graphics2D graphics = bi.createGraphics();
/**
* 设置背景色
*/
graphics.setColor(Color.white);
graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());
graphics.setColor(Color.black);
AttributedString attstr = new AttributedString(test);
TextLayout textTl = new TextLayout(test, new Font("Courier", Font.BOLD,
70), new FontRenderContext(null, true, false));
AffineTransform textAt = graphics.getTransform();
graphics.setFont(new Font("Courier", Font.BOLD,70));
graphics.setColor(this.getRandColor());
graphics.drawString(test, 10,70);
// textTl.draw(graphics, 4, 60);
int w = bi.getWidth();
int h = bi.getHeight();
shear(graphics, w, h, Color.white);
// this.drawThickLine(graphics, 0, generator.nextInt(ImageHeight) + 1,
// ImageWidth, generator.nextInt(ImageHeight) + 1, 4, Color.BLACK);
resp.setContentType("image/jpg");
encoder.encode(bi);
}
private void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
public void shearX(Graphics g, int w1, int h1, Color color) {
int period = generator.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = generator.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
public void shearY(Graphics g, int w1, int h1, Color color) {
int period = generator.nextInt(40) + 10; // 50;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(i, 0, 1, h1, 0, (int) d);
if (borderGap) {
g.setColor(color);
g.drawLine(i, (int) d, i, 0);
g.drawLine(i, (int) d + h1, i, h1);
}
}
}
private void drawThickLine(Graphics g, int x1, int y1, int x2, int y2,
int thickness, Color c) {
// The thick line is in fact a filled polygon
g.setColor(c);
int dX = x2 - x1;
int dY = y2 - y1;
// line length
double lineLength = Math.sqrt(dX * dX + dY * dY);
double scale = (double) (thickness) / (2 * lineLength);
// The x and y increments from an endpoint needed to create a
// rectangle...
double ddx = -scale * (double) dY;
double ddy = scale * (double) dX;
ddx += (ddx > 0) ? 0.5 : -0.5;
ddy += (ddy > 0) ? 0.5 : -0.5;
int dx = (int) ddx;
int dy = (int) ddy;
// Now we can compute the corner points...
int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0] = x1 + dx;
yPoints[0] = y1 + dy;
xPoints[1] = x1 - dx;
yPoints[1] = y1 - dy;
xPoints[2] = x2 - dx;
yPoints[2] = y2 - dy;
xPoints[3] = x2 + dx;
yPoints[3] = y2 + dy;
g.fillPolygon(xPoints, yPoints, 4);
}
}
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.AttributedString;
import java.util.Random;
import javax.servlet.ServletException;
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 SimpleCaptcha extends HttpServlet {
private Random generator = new Random();
private final static String SIMPLE_CAPCHA_SESSION_KEY = "SIMPLE_CAPCHA_SESSION_KEY";
private static char[] captchars = new char[] { 'a', 'b', 'c', 'd', 'e',
'2', '3', '4', '5', '6', '7', '8', 'g', 'f', 'y', 'n', 'm', 'n',
'p', 'w', 'x' };
/**
* 产生随机字体
*
* @return
*/
private Font getFont() {
Random random = new Random();
Font font[] = new Font[5];
font[0] = new Font("Ravie", Font.PLAIN, 45);
font[1] = new Font("Antique Olive Compact", Font.PLAIN, 45);
font[2] = new Font("Forte", Font.PLAIN, 45);
font[3] = new Font("Wide Latin", Font.PLAIN, 40);
font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 45);
return font[random.nextInt(5)];
}
/**
* 随机产生定义的颜色
*
* @return
*/
private Color getRandColor() {
Random random = new Random();
Color color[] = new Color[10];
color[0] = new Color(32, 158, 25);
color[1] = new Color(218, 42, 19);
color[2] = new Color(31, 75, 208);
return color[random.nextInt(3)];
}
/**
* @see javax.servlet.http.HttpServlet#void
* (javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int ImageWidth = 200;
int ImageHeight = 100;
int car = captchars.length - 1;
/**
* 产生随机字符串
*/
String test = "";
for (int i = 0; i < 4; i++) {
test += captchars[generator.nextInt(car) + 1];
}
/**
* 放放Session
*/
req.getSession().setAttribute(SimpleCaptcha.SIMPLE_CAPCHA_SESSION_KEY,
test);
/**
* 得到输出流
*/
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp
.getOutputStream());
BufferedImage bi = new BufferedImage(ImageWidth + 10, ImageHeight,
BufferedImage.TYPE_BYTE_INDEXED);
Graphics2D graphics = bi.createGraphics();
/**
* 设置背景色
*/
graphics.setColor(Color.white);
graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight());
graphics.setColor(Color.black);
AttributedString attstr = new AttributedString(test);
TextLayout textTl = new TextLayout(test, new Font("Courier", Font.BOLD,
70), new FontRenderContext(null, true, false));
AffineTransform textAt = graphics.getTransform();
graphics.setFont(new Font("Courier", Font.BOLD,70));
graphics.setColor(this.getRandColor());
graphics.drawString(test, 10,70);
// textTl.draw(graphics, 4, 60);
int w = bi.getWidth();
int h = bi.getHeight();
shear(graphics, w, h, Color.white);
// this.drawThickLine(graphics, 0, generator.nextInt(ImageHeight) + 1,
// ImageWidth, generator.nextInt(ImageHeight) + 1, 4, Color.BLACK);
resp.setContentType("image/jpg");
encoder.encode(bi);
}
private void shear(Graphics g, int w1, int h1, Color color) {
shearX(g, w1, h1, color);
shearY(g, w1, h1, color);
}
public void shearX(Graphics g, int w1, int h1, Color color) {
int period = generator.nextInt(2);
boolean borderGap = true;
int frames = 1;
int phase = generator.nextInt(2);
for (int i = 0; i < h1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(0, i, w1, 1, (int) d, 0);
if (borderGap) {
g.setColor(color);
g.drawLine((int) d, i, 0, i);
g.drawLine((int) d + w1, i, w1, i);
}
}
}
public void shearY(Graphics g, int w1, int h1, Color color) {
int period = generator.nextInt(40) + 10; // 50;
boolean borderGap = true;
int frames = 20;
int phase = 7;
for (int i = 0; i < w1; i++) {
double d = (double) (period >> 1)
* Math.sin((double) i / (double) period
+ (6.2831853071795862D * (double) phase)
/ (double) frames);
g.copyArea(i, 0, 1, h1, 0, (int) d);
if (borderGap) {
g.setColor(color);
g.drawLine(i, (int) d, i, 0);
g.drawLine(i, (int) d + h1, i, h1);
}
}
}
private void drawThickLine(Graphics g, int x1, int y1, int x2, int y2,
int thickness, Color c) {
// The thick line is in fact a filled polygon
g.setColor(c);
int dX = x2 - x1;
int dY = y2 - y1;
// line length
double lineLength = Math.sqrt(dX * dX + dY * dY);
double scale = (double) (thickness) / (2 * lineLength);
// The x and y increments from an endpoint needed to create a
// rectangle...
double ddx = -scale * (double) dY;
double ddy = scale * (double) dX;
ddx += (ddx > 0) ? 0.5 : -0.5;
ddy += (ddy > 0) ? 0.5 : -0.5;
int dx = (int) ddx;
int dy = (int) ddy;
// Now we can compute the corner points...
int xPoints[] = new int[4];
int yPoints[] = new int[4];
xPoints[0] = x1 + dx;
yPoints[0] = y1 + dy;
xPoints[1] = x1 - dx;
yPoints[1] = y1 - dy;
xPoints[2] = x2 - dx;
yPoints[2] = y2 - dy;
xPoints[3] = x2 + dx;
yPoints[3] = y2 + dy;
g.fillPolygon(xPoints, yPoints, 4);
}
}
发表评论
-
简单的使用jackson的annotation
2011-02-16 10:27 25284@JsonAutoDetect (class) 这是作用 ... -
Jackson 入门
2011-02-16 10:25 22030原文链接: http://jackson.codehaus. ... -
Jackson 使用简介
2011-02-16 10:20 8125http://jackson.codehaus.org/ ... -
nexus-maven- repository-index.zip手动下载与设置
2010-04-16 14:46 12694问题描述: 在启动eclipse的时候,在maven控制 ... -
MyEclipse启动故障-Initializing Java Tooling
2010-04-16 14:43 5699最近安装新系统后,重新安装了JDK,然后启动以前安装的MyEc ... -
iframe跨域session丢失问题
2010-02-04 15:37 5551最近在做一个系统(A),需要在系统(A)中集成目前现存系统(B ... -
SSH常见问题及解决办法
2010-01-21 17:18 3826内容检索 1.警告: No configuratio ... -
SLF4J+logBack, 日志领域中的新秀
2009-04-25 13:57 3629Ceki Gülcü创造了日志领 ... -
struts2.1.6,spring2.5.6,hibernate3.3.1,annotations
2009-04-24 15:50 3117根据流程进行注意点的 ... -
用HttpClient来模拟浏览器GET POST
2009-01-09 11:37 2275一般的情况下我们都是使用IE或者Navigator浏览器来访问 ... -
getOutputStream() has already been called for this
2008-11-07 16:30 2692有一个使用SerlvetResponse输出图像的例子,代码如 ... -
深入探索 高效的Java异常处理框架【转自www.bitsCN.com】
2008-11-03 11:58 2841摘要:本文从Java异常最基本的概念、语法开始讲述了Java异 ... -
Spring+Hibernate+Struts2整合文档
2008-11-03 10:44 3817一、 Spring+Hibernate整合: Spring整 ... -
Tomcat启动分析
2008-10-29 11:05 30171 - Tomcat Server的组成部 ... -
tomcat集群和负载均衡
2008-10-29 11:00 3491(一)环境说明(1)服务器 ... -
Log4j配置文件
2008-10-29 10:58 2311#配置根Logger,其语法为:log4j.rootLog ... -
c3p0连接池说明
2008-09-18 11:57 3226<c3p0-config> <def ... -
利用xfire编写webservice
2008-08-15 10:19 37831. xfire + spring 发布webserv ... -
struts + spring + xfire (组合)
2008-08-15 10:14 3922一般情况下, spring+ struts的组合,struts ... -
无所不能的“蚂蚁”--Ant(四)
2008-08-06 20:02 2270五.使用Ant运行本地程序 1.使用Ant运行windows的 ...
相关推荐
在Java中,我们可以创建一个自定义的验证码生成器来实现这一功能。这个过程通常包括以下几个关键步骤: 1. **随机字符生成**: 验证码通常由字母、数字或者两者的组合构成。在Java中,可以使用`Random`类生成随机...
- 为了使验证码看起来更随机且难以被机器识别,我们通常会使用多种字体或者扭曲字体样式。Java提供了一些内置字体,也可以加载自定义字体。`Font`类用于创建和管理字体,`Graphics2D`的`setFont()`方法可以改变绘制...
2. **字体样式**:选择不同的字体或扭曲字体可以使验证码更难以被机器识别,同时保持对人类用户友好。 3. **噪声干扰**:在验证码图像上添加随机的线条、点或斑块,可以增加机器识别的难度,但不应过度到影响人眼...
在JAVA编程语言中,我们可以实现动态生成验证码的机制,以提供安全的用户验证体验。下面将详细介绍如何在JAVA中实现验证码的生成。 首先,验证码通常由一组随机字符(包括字母、数字)组成,它们被扭曲、旋转或添加...
3. **扭曲和旋转文字**:为了增加识别难度,验证码中的文字可能会被扭曲、倾斜或旋转。这可以通过调整`Graphics2D`对象的坐标系统和旋转角度来实现。 4. **保存和输出图像**:最后,生成的图像需要保存为PNG或JPEG...
在Java编程语言中,我们可以创建一个图像验证码生成器来实现这一功能。下面我们将详细探讨如何使用Java来生成带有干扰线的图片验证码。 首先,验证码的基本原理是随机生成一组字符,然后将这些字符以图像的形式展示...
- 将验证码图片输出为JPEG或PNG格式,通过HTTP响应发送给客户端。 2. **图片响应**: - 在Servlet的`doGet`方法中,设置响应头`Content-Type`为`image/jpeg`或`image/png`,表示返回的是图片数据。 - 使用`...
然而,为了增强验证码的安全性,我们通常会在验证码图片上添加干扰线、点或者扭曲,以防止OCR工具识别。这涉及到图像处理,我们可以使用Java的`java.awt`和`javax.imageio`库来实现。以下是一个简单的例子,展示了...
在Java Web开发中,验证码(CAPTCHA)是一种用于防止机器人或恶意自动化脚本进行非法操作的安全机制。它通常由一串随机字符组成,用户需要在输入框中正确输入才能完成某些敏感操作,如注册、登录等。本篇将详细介绍...
在本项目中,我们关注的是使用Java来生成图像验证码的技术。下面将详细介绍这个主题。 Java生成图像验证码涉及到以下几个关键知识点: 1. **随机数生成**:验证码通常由一组随机生成的字符组成,可以是数字、字母...
2. **图片扭曲效果**:增加验证码图片的扭曲效果,提高破解难度。 3. **用户行为分析**:记录用户的请求频率等信息,识别异常登录行为。 4. **多语言支持**:支持不同语言的验证码字符集。 综上所述,本文档详细...
首先,验证码的基本原理是生成一组随机字符(通常包含字母、数字和特殊字符),并将其以扭曲、倾斜、加噪等方式显示出来,以此增加机器识别的难度。在Java中,我们可以使用`java.awt`和`javax.imageio`这两个包来...
这个"java生成验证码demo"提供了生成自定义验证码图片的方法,包括设置图片尺寸、验证码长度,以及添加各种视觉混淆元素,以增加机器识别的难度。 首先,我们要理解验证码的基本原理。它通常由一组随机生成的字母或...
这里,"captcha.png"是待识别的验证码图片,"output.txt"是输出的识别结果文本文件,"-l chi_sim"指定了使用简体中文语言包。 4. **处理输出**: Tesseract会将识别结果输出到指定的文本文件中,你可以打开这个文件...
在Java中,我们可以利用多种库和技术来生成这种安全的图像验证码。本项目提供的是一款用Java编写的验证码生成工具,包括showyanzhengma.exe可执行文件、yanzhengma6(50).exe以及yanzhengma6(50).jar文件。 验证码的...
4. **保存图像到HTTP响应**:将生成的验证码图像写入到HTTP响应的输出流中,以图片格式(如JPEG或PNG)提供给客户端浏览器。 5. **存储验证码值**:同时,需要将生成的验证码字符串存储在服务器的会话(session)中...
- 为了增加安全性,可以使用扭曲、旋转、添加噪声等方法使验证码图像更难被OCR软件识别。 - 使用HTTPS协议传输验证码,以防止在传输过程中被窃取。 6. **优化用户体验**: - 提供音频验证码,方便视觉障碍者使用...
在Java中生成验证码涉及到图像处理、随机数生成以及字符编码等多个知识点。以下将详细介绍如何在Java中创建一个能生成中文、英文和数字的验证码。 1. **随机数生成**:首先,我们需要生成随机的验证码字符。Java...
通常,验证码会显示一组扭曲的字母或数字,需要用户输入所见内容以完成验证。 2. **Java验证码识别流程**: - **图像预处理**:首先,我们需要对验证码图像进行预处理,包括灰度化、二值化、噪声去除、平滑滤波等...
Java作为一款多用途的编程语言,提供了丰富的库和方法来生成包括GIF格式在内的图片验证码。下面将详细讨论如何在Java中创建GIF动态验证码。 首先,我们需要理解GIF图片验证码的基本构成。它通常包含随机生成的文字...