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表格 这篇文章的话,效果是可以实现,但是经过我反复试验,还是存在一些问题的. 今天这篇文章就是向大家介绍下如何避免 ...
随机推荐
- 深入理解JavaScript函数
本篇文章主要介绍了"深入理解JavaScript函数",主要涉及到JavaScript函数方面的内容,对于深入理解JavaScript函数感兴趣的同学可以参考一下. JavaScr ...
- Python爬虫实战:将网页转换为pdf电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- Qt之QSS(Q_PROPERTY-自定义属性)
版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者:一去丶二三里 博客地址:http://blog.csdn.net/liang19890820 目录(?)[+] ...
- requireJS的优化工具 ---- r.js
requireJS是javascript的模块加载器,是基于AMD规范实现的. r.js是其提供的对模块进行打包和构建的一个工具 下载 r.js 创建r.js 的配置文件 build.js build ...
- JavaScript获取当前网页的源码
通过 outerHTML document.documentElement.outerHTML 通过异步请求 $.get(window.location.href,function(res){ con ...
- python UI自动化实战记录二:请求接口数据并提取数据
该部分记录如何获取预期结果-接口响应数据,分成两步: 1 获取数据源接口数据 2 提取后续页面对比中要用到的数据 并且为了便于后续调用,将接口相关的都封装到ProjectApi类中. 新建python ...
- Centos6.5(Linux)安装Nginx
1.安装nginx依赖的库pcre 下载地址:http://sourceforge.net/projects/pcre/ 2.解压pcre zip解压方式:unzip ...
- Netbackup用于技术支持的问题报告(报障模版)
在与支持部门联系以报告问题之前,请填写以下信息. 日期: _________________________记录以下产品.平台和设备信息:■ 产品及其版本级别.■ 服务器硬件类型和操作系统级别.■ 客 ...
- [USACO17FEB]Why Did the Cow Cross the Road III G
嘟嘟嘟 首先看到这种序列的问题,我就想到了逆序对,然后就想如何把这道题转化. 首先要满足这个条件:ai <bi.那么我们把所有数按第一次出现的顺序重新赋值,那么对于新的数列,一定满足了ai &l ...
- 使用pako.js实现gzip的压缩和解压
poko.js可至Github下载:https://github.com/nodeca/pako 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...