怎么用java实现验证码(完整版)

YUANYUANYINGBEN2 2011-03-21 11:36:11
用java实现验证码,谁有完整版地,请各位赐教啊
...全文
30150 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
seguzhizi 2013-11-29
  • 打赏
  • 举报
回复
引用 15 楼 fengweizhi1985 的回复:
没有一个靠谱的,请试完之后再发表评论。
直接复制3楼就可以~!
屎克螂 2013-07-30
  • 打赏
  • 举报
回复
引用 7 楼 qiheia 的回复:
[Quote=引用 5 楼 yuanyuanyingben2 的回复:] 引用楼主 yuanyuanyingben2 的回复: 用java实现验证码,谁有完整版地,请各位赐教啊 没找到啊。。删了吧什么都没有啊 [/Quote] 哎,还是贴出来吧。。。。。。。。。   makeCertPic.java   package pic;   import java.awt.Color;   import java.awt.Font;   import java.awt.Graphics;   import java.awt.image.BufferedImage;   import java.io.IOException;   import java.io.OutputStream;   import java.util.Random;   import javax.imageio.ImageIO;   /**    * @author dzy    * 生成验证码图片    */   public class makeCertPic { //验证码图片中可以出现的字符集,可根据需要修改 private char mapTable[]={ 'a','b','c','d','e','f', 'g','h','i','j','k','l', 'm','n','o','p','q','r', 's','t','u','v','w','x', 'y','z','0','1','2','3', '4','5','6','7','8','9'}; /** * 功能:生成彩色验证码图片 * 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流 */ public String getCertPic(int width, int height, OutputStream os) { if(width<=0)width=60; if(height<=0)height=20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 设定背景色 g.setColor(new Color(0xDCDCDC)); g.fillRect(0, 0, width, height); //画边框 g.setColor(Color.black); g.drawRect(0,0,width-1,height-1); // 取随机产生的认证码 String strEnsure = ""; // 4代表4位验证码,如果要生成更多位的认证码,则加大数值 for(int i=0; i<4; ++i) { strEnsure+=mapTable[(int)(mapTable.length*Math.random())]; } //   将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句 g.setColor(Color.black); g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); String str = strEnsure.substring(0,1); g.drawString(str,8,17); str = strEnsure.substring(1,2); g.drawString(str,20,15); str = strEnsure.substring(2,3); g.drawString(str,35,18); str = strEnsure.substring(3,4); g.drawString(str,45,15); // 随机产生10个干扰点 Random rand = new Random(); for (int i=0;i<10;i++) { int x = rand.nextInt(width); int y = rand.nextInt(height); g.drawOval(x,y,1,1); } // 释放图形上下文 g.dispose(); try { // 输出图像到页面 ImageIO.write(image, "JPEG", os); } catch (IOException e) { return ""; } return strEnsure; }   }   在getCertPic()方法中,首先创建了一个内存图像的实例对象,再得到此内存图像的图形上下文对象,接着再用这个上下文对象画背景、边框。接下来,随机生成4个在mapTable[]数组中的字符,组成字符串作为验证字符串,并输出在内存中,为了造成一定的干扰,随机画了10个干扰点,如果要加大干扰效果,可再多画一些点。 makeCertPic.jsp页面用于调用生成验证码图片的JavaBean,并在客户端显示,源代码如下:   makeCertPic.jsp   <%@page contentType="image/jpeg" %>   <jsp:useBean id="image" scope="page" class="pic.makeCertPic" />   <%   String str=image.getCertPic(0,0,response.getOutputStream());    // 将认证码存入SESSION   session.setAttribute("certCode", str);   out.clear();    out = pageContext.pushBody();   %>   这里把生成的验证码作为session变量写入,因此在接收登录页面输入的数据页面中,可用用户输入的验证码和这个session变量作比较,如果相同则表示验证通过。   LoginPic.jsp   <%@ page contentType="text/html;charset=GB2312" %> <script type="text/javascript"> function reloadcode(){ var verify=document.getElementById('code'); verify.setAttribute('src','makeCertPic.jsp?it='+Math.random()); } </script>   <html>    <head><title>登录页面</title></head>    <body>   <table align="center" border="0"> <tralign="center"><td><fontcolor="red"><html:errors/></font></td></tr>    <tr align="center"><td>系统登录</td></tr>    <form. action="loginCheck.jsp" method="post" focus="username">    <tr><td>用户名:<input type="text" name="username"/></td></tr>    <tr><td>密  码:<input type="password"name="password"/></td></tr>    <tr><td>验证码<img src="makeCertPic.jsp" id="code" onclick="reloadcode()" style="cursor: pointer;" alt="看不清楚,换一张"> </td></tr> <tralign="left"><td>            <input type="submit" value="确定"/></td></tr>    </form>    </table>    </body>   </html>   验证码的输入是否正确可用如下语句验证:   String certCode=request.getParameter("certCode");   if(certCode.equals((String)session.getAttribute("certCode"))) out.print("验证码输入正确");   else out.print("验证码输入错误");
你的可以,但是我进入到STRUTS2 action中后再跳回来 验证码就出不来了 求解决
hp3 2013-05-10
  • 打赏
  • 举报
回复
thank tier 7,
Andyzty 2013-04-17
  • 打赏
  • 举报
回复
怎么用strut1 实现呀
CO___CO 2012-11-11
  • 打赏
  • 举报
回复
很详细,顶起!!
xuzhuocool 2012-09-19
  • 打赏
  • 举报
回复
好用的 支持一下
csh448967586 2012-09-06
  • 打赏
  • 举报
回复
支持qiheia,已经实现了

真的很强大
fengweizhi1985 2012-07-09
  • 打赏
  • 举报
回复
没有一个靠谱的,请试完之后再发表评论。
denyyou123 2012-07-06
  • 打赏
  • 举报
回复
给你个连接地址 去里面看下 是产生验证码的一个程序 有截图的
http://blog.sina.com.cn/s/blog_4fdb887b01013v84.html
ttyyaabb 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 yuanyuanyingben2 的回复:
引用楼主 yuanyuanyingben2 的回复:
用java实现验证码,谁有完整版地,请各位赐教啊
没找到啊。。删了吧什么都没有啊

哎,还是贴出来吧。。。。。。。。。


  makeCertPic.java
  package pic;
  import java.awt.Color;
  import jav……
[/Quote]

makeCertPic.jsp有什么用啊,放哪啊不是有个验证的页面有个java类就够了么
bobo7605 2012-04-12
  • 打赏
  • 举报
回复
谢谢你。谢谢你。
ajaxUser002 2011-03-21
  • 打赏
  • 举报
回复
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
Graphics g = image.getGraphics();

//生成随机类
Random random = new Random();

// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));


// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}

// 取随机产生的认证码(4位数字)

String codeList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

String sRand="";


for (int i=0;i<4;i++){
int a=random.nextInt(codeList.length()-1);
String rand=codeList.substring(a,a+1);
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}

// 将认证码存入SESSION
session.setAttribute("rand",sRand);

// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();


%>

前台显示 然后将验证码放入session 后台从session取
caibird1024 2011-03-21
  • 打赏
  • 举报
回复
一搜一大片
qiheia 2011-03-21
  • 打赏
  • 举报
回复
我的QQ空间有完整版的,你去查看下吧,我就不贴代码了。。。。
Spring89 2011-03-21
  • 打赏
  • 举报
回复
<%@ page contentType="image/jpeg" language="java" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*,java.io.OutputStream" %>
<%@page import="java.io.*"%>
<%@page import="javax.imageio.stream.ImageOutputStream"%>

<%!
ByteArrayInputStream inputStream;
String code = "";
// 产生四个0~9的随机数,放在一个字符串里
public String createRandomString() {
String str = "";
for (int i = 0; i < 4; i++) {
str += Integer.toString((new Double(Math.random() * 10)).intValue());
}
return str;
}

// 随机产生一个颜色
public Color createsRandomColor() {
int r = (new Double(Math.random() * 256)).intValue();
int g = (new Double(Math.random() * 256)).intValue();
int b = (new Double(Math.random() * 256)).intValue();
return new Color(r, g, b);
}


%>

<%
int width = 60;
int height = 22;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Random random = new Random();
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
// 画边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width - 1, height - 1);
// 随机产生10条干扰线,使图象中的认证码不易被其它程序探测到。
g.setColor(Color.BLACK);
for (int i = 0; i < 10; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x, y, x + xl, y + yl);
}
// 将认证码显示到图象中
g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
// 使用随机颜色
g.setColor(this.createsRandomColor());

String[] codeStr = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
"T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

int x = width / (4 + 1);
int codeY = height - 4;

StringBuffer randomCode = new StringBuffer();
for (int i = 0; i < 4; i++) {
// 得到随机产生的验证码数字。
String strRand = codeStr[random.nextInt(codeStr.length)];
// 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
int red = random.nextInt(100);
int green = random.nextInt(100);
int blue = random.nextInt(100);
// 用随机产生的颜色将验证码绘制到图像中。
g.setColor(new Color(red, green, blue));
g.drawString(strRand, i * (x), codeY);
// 将产生的四个随机数组合在一起。
randomCode.append(strRand);
}

// 图象生效
g.dispose();
session.setAttribute("code",randomCode.toString());
OutputStream os = response.getOutputStream();
// 输出图象到页面
ImageIO.write(image, "JPEG", os);
os.flush();
os.close();
os = null;
response.flushBuffer();
out.clear();
out = pageContext.pushBody();

%>
YUANYUANYINGBEN2 2011-03-21
  • 打赏
  • 举报
回复
呵呵,谢谢你。
qiheia 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yuanyuanyingben2 的回复:]
引用楼主 yuanyuanyingben2 的回复:
用java实现验证码,谁有完整版地,请各位赐教啊
没找到啊。。删了吧什么都没有啊
[/Quote]
哎,还是贴出来吧。。。。。。。。。


  makeCertPic.java
  package pic;
  import java.awt.Color;
  import java.awt.Font;
  import java.awt.Graphics;
  import java.awt.image.BufferedImage;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Random;
  import javax.imageio.ImageIO;
  /**
   * @author dzy
   * 生成验证码图片
   */
  public class makeCertPic {
//验证码图片中可以出现的字符集,可根据需要修改
private char mapTable[]={
'a','b','c','d','e','f',
'g','h','i','j','k','l',
'm','n','o','p','q','r',
's','t','u','v','w','x',
'y','z','0','1','2','3',
'4','5','6','7','8','9'};
/**
* 功能:生成彩色验证码图片
* 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流
*/
public String getCertPic(int width, int height, OutputStream os) {
if(width<=0)width=60;
if(height<=0)height=20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
//画边框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);
// 取随机产生的认证码
String strEnsure = "";
// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
for(int i=0; i<4; ++i) {
strEnsure+=mapTable[(int)(mapTable.length*Math.random())];
}
//   将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
g.setColor(Color.black);
g.setFont(new Font("Atlantic Inline",Font.PLAIN,18));
String str = strEnsure.substring(0,1);
g.drawString(str,8,17);
str = strEnsure.substring(1,2);
g.drawString(str,20,15);
str = strEnsure.substring(2,3);
g.drawString(str,35,18);
str = strEnsure.substring(3,4);
g.drawString(str,45,15);
// 随机产生10个干扰点
Random rand = new Random();
for (int i=0;i<10;i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawOval(x,y,1,1);
}
// 释放图形上下文
g.dispose();
try {
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
return "";
}
return strEnsure;
}
  }

  在getCertPic()方法中,首先创建了一个内存图像的实例对象,再得到此内存图像的图形上下文对象,接着再用这个上下文对象画背景、边框。接下来,随机生成4个在mapTable[]数组中的字符,组成字符串作为验证字符串,并输出在内存中,为了造成一定的干扰,随机画了10个干扰点,如果要加大干扰效果,可再多画一些点。
makeCertPic.jsp页面用于调用生成验证码图片的JavaBean,并在客户端显示,源代码如下:
  makeCertPic.jsp
  <%@page contentType="image/jpeg" %>
  <jsp:useBean id="image" scope="page" class="pic.makeCertPic" />
  <%
  String str=image.getCertPic(0,0,response.getOutputStream());
   // 将认证码存入SESSION
  session.setAttribute("certCode", str);

  out.clear();
   out = pageContext.pushBody();
  %>

  这里把生成的验证码作为session变量写入,因此在接收登录页面输入的数据页面中,可用用户输入的验证码和这个session变量作比较,如果相同则表示验证通过。
  LoginPic.jsp
  <%@ page contentType="text/html;charset=GB2312" %>

<script type="text/javascript">
function reloadcode(){
var verify=document.getElementById('code');
verify.setAttribute('src','makeCertPic.jsp?it='+Math.random());
}
</script>
  <html>
   <head><title>登录页面</title></head>
   <body>
  <table align="center" border="0">
<tralign="center"><td><fontcolor="red"><html:errors/></font></td></tr>
   <tr align="center"><td>系统登录</td></tr>
   <form. action="loginCheck.jsp" method="post" focus="username">
   <tr><td>用户名:<input type="text" name="username"/></td></tr>
   <tr><td>密  码:<input type="password"name="password"/></td></tr>
   <tr><td>验证码<img src="makeCertPic.jsp" id="code" onclick="reloadcode()" style="cursor: pointer;" alt="看不清楚,换一张"> </td></tr>
<tralign="left"><td>        
   <input type="submit" value="确定"/></td></tr>
   </form>
   </table>
   </body>
  </html>



  验证码的输入是否正确可用如下语句验证:
  String certCode=request.getParameter("certCode");
  if(certCode.equals((String)session.getAttribute("certCode")))
out.print("验证码输入正确");
  else
out.print("验证码输入错误");



hzzduoduo 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hepeng154833488 的回复:]
支持上楼
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(……
[/Quote]
这个就是的
YUANYUANYINGBEN2 2011-03-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuanyuanyingben2 的回复:]
用java实现验证码,谁有完整版地,请各位赐教啊
[/Quote]没找到啊。。删了吧什么都没有啊
hepeng_8 2011-03-21
  • 打赏
  • 举报
回复
支持上楼
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//给定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);

// 在内存中创建图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
Graphics g = image.getGraphics();

//生成随机类
Random random = new Random();

// 设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);

//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));


// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}

// 取随机产生的认证码(4位数字)

String codeList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

String sRand="";


for (int i=0;i<4;i++){
int a=random.nextInt(codeList.length()-1);
String rand=codeList.substring(a,a+1);
sRand+=rand;
// 将认证码显示到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}

// 将认证码存入SESSION
session.setAttribute("rand",sRand);

// 图象生效
g.dispose();

// 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream());
out.clear();
out = pageContext.pushBody();


%>

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧