java的动态验证码单线设计
1.java的动态验证码我这里将介绍两种方法:
一:根据java本身提供的一种验证码的写法,这种呢只限于大家了解就可以了,因为java自带的模式编写的在实际开发中是没有意义的,所以只供学习一下就可以了,待会讲解的第二种呢就是我们需要掌握的一种模式了:
第一种的代码如下:
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.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response);
} /**动态生成图片验证码
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//创建图像
int width=100;
int height=40;
//图片的大小设置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//创建画板
Graphics g=image.getGraphics(); setSquareBackGround(g,width,height,5);
//确定画笔颜色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//画随机干扰框
setSquareBackGround(g,width,height,3);
//画干扰点
CreateRandomPoint(width, height,100,g,100);
//随机画几条线
CreateRandomLine(width, height,8,g,100);
//随机获取4个字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62个填充字符里面随机的随机的收取字符
int index=random.nextInt(62);
//截取一个字符
String st=str.substring(index, index+1);
//把字符放到图片中去
g.setColor(Color.red);
//设置字体
g.setFont(new Font("宋体",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4个字符在一起
sb.append(st);
} //把StringBuffer中的验证码放到session里面,目的是让Login调用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString()); //发送图片到浏览器 指定发送的图片 和格式
response.setContentType("image/jpeg");
//图片,图片的格式,输出的方式
ImageIO.write(image, "jpg", response.getOutputStream()); }
Random rand = new Random();
private void CreateRandomPoint(int width,int height,int many,Graphics g,int alpha)
{ // 随机产生干扰点
for (int i=0;i<many;i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.setColor(getColor(alpha));
g.drawOval(x,y,rand.nextInt(3),rand.nextInt(3));
}
}
/**
* 随机产生干扰线条
* @param width
* @param height
* @param minMany 最少产生的数量
* @param g
* @param alpha 透明度0~255 0表示全透
*/
private void CreateRandomLine(int width,int height,int minMany,Graphics g,int alpha)
{ // 随机产生干扰线条
for (int i=0;i<getIntRandom(minMany, minMany+6);i++) {
int x1 =getIntRandom(0,(int)(width*0.6));
int y1 =getIntRandom(0,(int)(height*0.6));
int x2 =getIntRandom((int)(width*0.4),width);
int y2 =getIntRandom((int)(height*0.2),height);
g.setColor(getColor(alpha));
g.drawLine(x1, y1, x2, y2);
}
} /**
* 由随机产生的方块来作为干扰背景
*/
private void setSquareBackGround(Graphics g,int width,int height,int count){
// 随机产生干扰线条
for (int i=0;i<getIntRandom(count, count+2);i++) {
int x1 =getIntRandom(0,(int)(width*0.3));
int y1 =getIntRandom(0,(int)(height*0.3));
int x2 =getIntRandom((int)(width*0.5),width);
int y2 =getIntRandom((int)(height*0.55),height);
g.setColor(getColor(100));
int w=x2-x1;
int h=y2-y1;
if(w<0) w=-w;
if(h<0) h=-h;
g.drawRect(x1, y1, w, h);
g.setColor(getColor(25));
g.fillRect(x1, y1, w, h);
}
}
private int getIntRandom(double start,double end)
{ if(end<start)
{
double t=end;
end=start;
start=t;
}
double i=start+(int) (Math.random()*(end-start));
return (int)i;
}
上面的代码呢写的很详细了,这里我就不重复了,这里的干扰线条是有很多写法的,我这里就没有全写出来,有需要的话可以私聊我哦!
下面介绍第二种:
这种呢是我们开发中是可以用得到的,使用在的是网页端的交互,我们在登录网站的时候有很多的验证码就可以用这个来写了
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* Servlet implementation class inde
*/
@WebServlet("/inde")
public class inde extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public inde() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response);
} /**动态生成图片验证码
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//创建图像
int width=100;
int height=40;
//图片的大小设置
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//创建画板
Graphics g=image.getGraphics(); setSquareBackGround(g,width,height,5);
//确定画笔颜色
g.setColor(Color.black);
//填充矩形
g.fillRect(0, 0, width, height);
//在大矩形中放小矩形
g.setColor(Color.WHITE);
g.fillRect(1, 1, width-2, height-2);
//填充字符
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789";
StringBuffer sb=new StringBuffer();
//随机获取4个字符
Random random=new Random();
for (int i = 0; i < 4; i++) {
//62个填充字符里面随机的随机的收取字符
int index=random.nextInt(62);
//截取一个字符
String st=str.substring(index, index+1);
//把字符放到图片中去
g.setColor(Color.red);
//设置字体
g.setFont(new Font("宋体",Font.BOLD,30));
g.drawString(st, 20*i, 30);//防止4个字符在一起
sb.append(st);
}
//把StringBuffer中的验证码放到session里面,目的是让Login调用
HttpSession se=request.getSession();
se.setAttribute("number", sb.toString()); //发送图片到浏览器 指定发送的图片 和格式
response.setContentType("image/jpeg");
//图片,图片的格式,输出的方式
ImageIO.write(image, "jpg", response.getOutputStream()); }
这样就可以运行了,当然了我们可以在这里面加入第一种的干扰模块给拿过来这样就可以实现整体的一个效果了
以上的代码我都实验过了,都是可以运行的,今天就想到这里了,感谢大家的欣赏
java的动态验证码单线设计的更多相关文章
- java生成动态验证码
import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;impor ...
- [转载] java的动态代理机制详解
转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...
- OSGI 面向Java的动态模型系统
OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...
- Atitit.ioc 动态配置文件guice 设计原理
Atitit.ioc 动态配置文件guice 设计原理 1. Bat启动时注入配置文件1 2. ioc调用1 3. Ioc 分发器 配合 apche MethodUtils.invokeStatic ...
- Servlet仿CSDN动态验证码的生成-带数字和字母
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.实现的思路: (1)首先,须要创建一个Servlet.该Servlet通过字节型响应给cl ...
- 深入理解Java的动态编译
前提 笔者很久之前就有个想法:参考现有的主流ORM框架的设计,造一个ORM轮子,在基本不改变使用体验的前提下把框架依赖的大量的反射设计去掉,这些反射API构筑的组件使用动态编译加载的实例去替代,从而可 ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java中动态代理实现机制
前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...
- 如何用easyui+JAVA 实现动态拼凑datagrid表格(续)
前面一段时间写了一篇文章: 如何用easyui+JAVA 实现动态拼凑datagrid表格 这篇文章的话,效果是可以实现,但是经过我反复试验,还是存在一些问题的. 今天这篇文章就是向大家介绍下如何避免 ...
随机推荐
- Android 自定义Dialog中加EditText弹不出键盘跟Dialog遮挡键盘的问题
先上两张图 第一张问题很明显,第二张是成功的图, 其实第一张是加了 //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INP ...
- Android 多个activity之间的共享数据
最近打算做一个时间助手,一个service监听课表信息.课表信息可以通过另外的activity来设置,所以这里就涉及到了数据的同步问题.我设置后的信息必须同步到监听的信息去. 在java中我们用全局变 ...
- Mac系统在finder拦显示当前所浏览的文件路径的方法
我们在使用MAC时,Finder栏默认只显示当前浏览的文件夹名称,而没有显示访问路径,这个问题该怎么解决呢? 编辑node的时候需要路径,亲测有效啦~可以试下! 操作步骤: 打开“终端”(应用程序-& ...
- Selenium2学习(三)-- 八种元素元素定位(Firebug和firepath)
前言 自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位.元素定位在这四个环节中是至关 ...
- JavaScript类型操作以及一些规范
类型检测 类型检测优先使用 typeof.对象类型检测使用 instanceof.null 或 undefined 的检测使用 == null. // string typeof variable = ...
- 【Spring实战】—— 7 复杂集合类型的注入
之前讲解了Spring的基本类型和bean引用的注入,接下来学习一下复杂集合类型的注入,例如:List.Set.Map等. 对于程序员来说,掌握多种语言是基本的技能. 我们这里做了一个小例子,程序员们 ...
- apache-实战(二)
Apache 虚拟主机 --用apache或nginx就可以做 一台服务器跑多台web服务 VPS virtual private server 虚拟专用服务器 --使用虚拟化技术来做 云服务器 虚拟 ...
- 1.GlusterFS 初识
一. GlusterFS 初始 1.1 分布式文件系统出现 计算机通过文件系统管理.存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储 ...
- 改写python round()函数,解决四舍五入问题 round(1.365,2)=1.36
round()函数四舍五入存在一个问题,遇到5不一定进一.如下图所示: print(round(1.365,2)) #1.36 没进一 print('%.2f'%1.365) print(round( ...
- 行高 line-height
一.行高的定义 line-height(行高):两行文字基线之间的距离 1.什么是基线? 2.为何是基线? 3.需要两行吗? 1.什么是基线? 我们上学的时候都用过,抄写英文字母的时候.其中有一条红线 ...