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的动态验证码单线设计的更多相关文章

  1. java生成动态验证码

    import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;impor ...

  2. [转载] java的动态代理机制详解

    转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...

  3. OSGI 面向Java的动态模型系统

    OSGI (面向Java的动态模型系统) OSGi(Open Service Gateway Initiative)技术是Java动态化模块化系统的一系列规范.OSGi一方面指维护OSGi规范的OSG ...

  4. Atitit.ioc 动态配置文件guice 设计原理

    Atitit.ioc 动态配置文件guice 设计原理 1. Bat启动时注入配置文件1 2. ioc调用1 3. Ioc 分发器 配合 apche  MethodUtils.invokeStatic ...

  5. Servlet仿CSDN动态验证码的生成-带数字和字母

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 一.实现的思路: (1)首先,须要创建一个Servlet.该Servlet通过字节型响应给cl ...

  6. 深入理解Java的动态编译

    前提 笔者很久之前就有个想法:参考现有的主流ORM框架的设计,造一个ORM轮子,在基本不改变使用体验的前提下把框架依赖的大量的反射设计去掉,这些反射API构筑的组件使用动态编译加载的实例去替代,从而可 ...

  7. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  8. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  9. 如何用easyui+JAVA 实现动态拼凑datagrid表格(续)

    前面一段时间写了一篇文章: 如何用easyui+JAVA 实现动态拼凑datagrid表格 这篇文章的话,效果是可以实现,但是经过我反复试验,还是存在一些问题的. 今天这篇文章就是向大家介绍下如何避免 ...

随机推荐

  1. 吐槽中小民营IT企业管理七宗罪

    傲慢.妒忌.暴怒.懒惰.贪婪.贪食及色欲,电影<七宗罪>中借七个典型的命案告诉我们,人性中最丑陋的七大恶行.在实际的工作中自己对企业的经营和日常管理有了一些更深刻的认识,偏偏自己又是一个很 ...

  2. CentOS安装QQ2012

    QQ想必大家都会用,在windows系统下一般都是使用客户端软件,但是在linxu系统下就没有想windows那样的客户端了.下面就次啊用wine在CentOS中安装腾讯QQ2012.

  3. bit byte 字 字节 关系 简列

    字 word 字节 byte 位 bit 字长是指字的长度 1字=2字节(1 word = 2 byte = 16bit) 1字节=8比特(1 byte = 8bit) 1比特=1位 一个字的字长为1 ...

  4. ElasticSearch索引快照

    参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-snapshots.html 备份数据之前,要创建一个 ...

  5. HTML基础内容(持续更新...)

    1.<!DOCTYPE html>声明有助于浏览器中正确显示网页 HTML5<!DOCTYPE html>HTML 4.01<!DOCTYPE HTML PUBLIC & ...

  6. tr标签是什么

    <tr> 标签定义 HTML 表格中的行. tr 元素包含一个或多个 th 或 td 元素.

  7. 常见WEB开发安全漏洞 原因分析及解决

    目 录 1 会话标识未更新 3 1.1 原因 3 1.2 解决 3 2 SQL注入 3 2.1 原因 3 2.2 解决 5 3 XSS跨站脚本编制 5 3.1 原因 5 3.2 解决 5 4 XSRF ...

  8. laravel 接入蚂蚁金服SDK(以支付宝APP支付为例)开发步骤

    一.创建应用及配置 首先需要到蚂蚁金服开放平台(https://docs.open.alipay.com)注册应用,获取应用id(APP_ID),并且配置应用,主要是签约应用,这个需要审核,一般2-5 ...

  9. 怎么看电脑有没有安装USB3.0驱动

    1.首先要看主板是否带USB3.0接口. 2.然后计算机-属性-设备管理器-通用串行总线,就可以看到是否有安装USB3.0驱动    

  10. 关于bootstrap-table服务端分页问题

    昨天项目中涉及到了前端表格分页问题.数据一共有1万多条,所以选择了后端分页. 之前用的都是前端分页,第一次使用后端分页.网上也找到了一些例子,最后做出来了. 这里用的是bootstrap-table插 ...