- 浏览: 1068422 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (639)
- 服务器配置篇 (58)
- hibernate篇 (14)
- spring篇 (33)
- struts篇 (28)
- JS篇 (46)
- 其他技术篇 (46)
- 数据库集群配置 (6)
- JAVA基础相关 (48)
- 分布式框架HadHoop的应用 (2)
- FLEX篇 (8)
- SQLSERVER技术 (32)
- Android学习 (13)
- amchart学习笔记 (1)
- openfire+smark搭建即时通讯 (9)
- Linux学习 (18)
- Oracle数据库 (15)
- 网站优化技术 (12)
- mysql数据库 (2)
- 项目学习总结 (18)
- 工具类(JAVA) (12)
- 工具类(JS) (2)
- 设计模式 (10)
- Lucene学习 (24)
- EJB3学习 (6)
- Sphinx搜索引擎 (3)
- 工作中用到的软件小工具 (5)
- .NET (49)
- JAVA 连接SQLSERVER2008步骤 (1)
- MongoDB (19)
- Android手机开发 (3)
- Maven (6)
- vue (9)
- Shiro (4)
- mybatis (3)
- netty框架 (1)
- SpringCloud (3)
- spring-cloud (7)
- Git (1)
- dubbo (2)
- springboot (13)
- rocketmq (1)
- git学习 (2)
- kafka服务器 (2)
- linux (10)
- WEB系统辅助项目 (1)
- jenkins (2)
- docker (4)
- influxdb (3)
- python (2)
- nginx (1)
最新评论
-
jiangfuofu555:
这样数据量大,效率怎么样?
sqlserver 实现分页的前台代码 以及后台的sqlserver语句 -
w156445045:
博主请问下,如何做到实时的刷新呢,
另外我后台是Java 谢谢 ...
web 版本的汽车仪表盘,非常好看。还有各种图形 -
jackyin5918:
<transportConnector name=&qu ...
ActiveMQ的activemq.xml详细配置讲解 -
握着橄榄枝的人:
你这个不是spring1.x的吧
spring1.x使用AOP实例 -
xiaophai:
全乱套了!
openfire+spark搭建完美的及时通讯
1.写一个SERVLET
package com.servlet;
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);
}
}
2.配置这个servlet
然后在你要用验证码的页面用图片的方式进行访问
body topmargin="0" leftmargin="0" bgcolor="#FFFFCC">
<input type="button" value="click" onclick="check()">
<img src="/WifeQianDao/login">
//WifeQianDao是工程名,/login为servlet的名字
</body>
发表评论
-
JVM调优总结
2019-07-10 17:14 371https://www.cnblogs.com/andy-zh ... -
JAVA RESULTSET 使用详解
2012-03-20 21:01 3157调用ResultSet中的last()方法时,提示: java ... -
JAVA采用JDBC执行批处理操作注意的问题
2012-03-20 20:50 1978让我们看看如何使用JDBC API在Java中执行批量插入。虽 ... -
java 各种加密算法详细比较
2012-03-15 11:07 2293本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密 ... -
java:大数据文件写入,读取,分割,排序,合并
2012-03-05 20:21 2034/** * 大数据排序合并 * * @param ar ... -
JAVA 连接池,方便在平时使用
2012-02-21 15:03 1032java连接池使用 -
Java动态代理实现
2012-02-28 09:19 1000Java动态代理实现 在目前的Java开发包中包含 ... -
Java Socket实战之五 使用加密协议传输对象
2012-02-16 13:49 1127本文地址:http://blog.csdn.net/kongx ... -
Java Socket实战之四 传输压缩对象
2012-02-16 13:48 1016转载:http://blog.csdn.net/kongxx/ ... -
Java Socket实战之三 传输对象
2012-02-16 13:48 683转载:http://blog.csdn.net/kongxx/ ... -
Java Socket实战之二 多线程通信
2012-02-16 13:47 1150本文地址:http://blog.csdn.net/kongx ... -
Java Socket实战之一 单线程通信
2012-02-16 13:46 1023转载:http://blog.csdn.net/kongx ... -
java5 新增线程池的使用
2012-02-09 09:26 1156package net.itdos.concurrent; ... -
P2P之UDP穿透NAT的原理与实现
2012-01-11 11:03 1252关键词: P2P UDP NAT 原理 穿透 Traveral ... -
火车票网上订票软件
2012-01-11 09:05 1911JAVA程序GOHOME自动抢票成功!非常棒~~~不多说,直接 ... -
java tcp/ip 通讯服务端和客户端
2011-12-15 08:20 1358java tcp/ip 通讯服务端和客户端 -
java 读取服务器上的某个文件,并解决UTF-8 BOM文件的问号问题
2011-11-28 15:16 1435JAVA读取UTF-8 BOM文件的时候会在文件头产生一个?号 ... -
JAVA 多线程学习笔记
2011-10-12 09:03 1071JAVA 多线程学习笔记 -
XBlink 1.0.0版发布,更轻、更快、更好用
2011-10-09 14:47 1314XBlink 1.0.0版发布,更轻、更快、更好用。 ... -
db4o 文件整理(收缩)
2011-09-29 22:26 1483一直都不敢大胆使用db4o,不是因为它不好用,不稳定,而 ...
相关推荐
Java使用Servlet实现登录验证码涉及到的是Web开发中的安全性与用户体验部分。验证码是一种常用的安全机制,用于防止自动化的机器人或恶意程序进行非法操作,如批量注册、恶意登录等。在这个例子中,我们将探讨两种...
3. 生成随机验证码:使用`java.util.Random`和`java.lang.Math`类生成一组随机数字或字母,组合成验证码字符串。 4. 保存验证码:将生成的验证码保存在会话(Session)中,以便在验证时进行比较。使用`...
在验证码系统中,Servlet可以生成随机验证码字符串,存储到服务器端,同时创建对应的图像文件供JSP展示。 验证码通常由一组随机字符组成,这些字符可能包括字母、数字、特殊符号等。在生成验证码时,我们可以通过...
4. **扭曲和变形**:为了增加验证码的可读性难度,我们可以扭曲和变形图像,例如旋转、缩放或倾斜文字。 5. **保存图像到响应流**:绘制完成后,Servlet将图像数据写入HTTP响应的输出流中,设置适当的MIME类型(如`...
在Servlet中生成图片验证码,首先需要创建一个Servlet类,该类将负责生成随机字符串并将其转化为图像。以下是一些关键步骤: 1. **生成随机字符串**:使用`java.util.Random`和`char[]`数组来创建一个指定长度的...
本教程将详细介绍如何使用Servlet技术来实现一个基本的图片验证码功能。Servlet是Java服务器端编程的核心技术之一,它可以接收和响应HTTP请求,非常适合构建动态Web应用程序。 首先,我们需要理解验证码的基本原理...
在本项目中,我们将探讨如何使用Java的Servlet和JSP技术来实现一个基本的验证码功能。 首先,验证码的核心是生成一段随机的、难以被机器识别的字符串。在Servlet中,我们可以创建一个方法生成这样的字符串,通常...
本话题将深入探讨如何使用Java Server Pages (JSP)来生成数字形式的随机验证码,并实现图片化显示及刷新功能。 首先,我们需要理解JSP的基本原理。JSP是一种动态网页技术,它允许开发人员在HTML页面中嵌入Java代码...
在Web开发中,Servlet是一种Java技术,用于生成动态网页内容。本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机...
在"使用Servlet生成图片验证码"这个主题中,我们首先会创建一个Servlet来生成随机的字母和数字组合,通常包含4到6位。这可以通过Java的Random类和Character类来实现。验证码生成后,将其保存在服务器的内存中,以便...
本项目名为“随机验证码(可刷新)”,它使用Java编程语言结合Servlet技术来实现一个动态生成并可刷新的验证码功能。这个功能尤其适用于Web应用,确保每次用户请求时都能得到一个新的、独一无二的验证码。 首先,...
在这个验证码实现中,Servlet将负责生成随机验证码图片以及验证用户输入的验证码是否正确。 1. **验证码生成**: - 首先,创建一个Servlet类,如`VerificationCodeServlet`,继承`HttpServlet`。 - 在`doGet`方法...
在生成动态验证码的场景下,Servlet负责接收客户端请求,生成随机验证码,并将其存储在服务器端,同时将验证码的图像返回给客户端显示。 验证码的生成通常包含以下几个步骤: 1. **随机数生成**:首先,我们需要...
在这个特定的例子中,我们关注的是如何利用Java Servlet生成验证码以及如何将验证码与JavaScript实现的菜单进行联动。 首先,Java Servlet是Java平台上的一个标准组件,它允许开发者创建动态web应用程序。在验证码...
- 验证码的生成通常包括选择随机字体、颜色、背景、扭曲、噪声等元素,以增加机器识别的难度。 - 文字或数字的组合可以动态生成,确保每次请求都不同。 - 使用`Graphics2D` API可以在Java中绘制验证码图像。 5. ...
在验证码场景下,Servlet主要负责处理HTTP请求,生成随机验证码,并将其存储在服务器端,同时将验证码的图像发送给客户端显示。 1. **验证码生成**:验证码通常由一组随机的字母和数字组成,具有一定的长度和复杂度...
- **干扰元素**:为了增加破解难度,验证码图像中通常会添加噪声、扭曲线条、背景色等干扰元素。这些可以通过在画布上随机绘制线条、圆点实现。 2. **Servlet处理**: - **HTTP请求**:当用户点击生成验证码时,...
在Web开发中,JavaScript和Servlet是两种常用的编程语言,它们可以结合使用来创建一个有效的验证码系统。 首先,JavaScript通常在客户端运行,它可以生成随机的图形验证码并在网页上显示。这个过程涉及以下几个步骤...
在这个JSP随机验证码实例中,我们将深入探讨其工作原理、实现方法以及源码解析。 验证码的核心是生成一组随机的、难以被程序识别的字符或数字组合。在JSP(JavaServer Pages)环境中,我们可以利用Java的强大功能来...
为了使验证码更难以被机器识别,可以扭曲字体、添加噪声或者模糊效果。 5. 随机数生成: `java.util.Random`类是生成随机数的基础,可以用于生成整数、浮点数等。在验证码生成中,我们需要生成一系列不重复的字符...