欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java验证码图片生成代码

程序员文章站 2024-03-05 20:15:49
java生成验证码图片的具体代码,供大家参考,具体内容如下 1、首先新建一各专门生成验证码图片的类verifycode: public class veri...

java生成验证码图片的具体代码,供大家参考,具体内容如下

1、首先新建一各专门生成验证码图片的类verifycode:

public class verifycode {


private int w=70;
private int h=35;
private random r=new random();
//宋体,华文楷书,黑体,华文新魏,华文隶书,微软雅黑,楷体_gb2312,times new roman
private string [] fontnames={"宋体","华文楷书","黑体","华文新魏","微软雅黑","华文隶书","楷体_gb2312","times new roman"};
//可选的字符
private string codes="23456789abcdefghijkmnopqrstuvwxyzabcdefghijklmnpqrstuvwxyz";
//背景色
private color bgcolor=new color(255,255,255);
//验证码上的文本
private string text;

//生成随机颜色
private color randomcolor(){
 int red=r.nextint(150);
 int green=r.nextint(150);
 int blue=r.nextint(150);
 return new color(red,green,blue);
}

//生成随机字体
private font randomfont(){
int index=r.nextint(fontnames.length);//获取下标
string fontname=fontnames[index];//生成随机的字体名称
int style=r.nextint(4);//获取随机样式,0表示无样式,1表示粗体,2表示斜体,3表示粗体加斜体
int size=r.nextint(5)+24;//生成随机字号,24~28
return new font(fontname,style,size);
}

//画干扰线
private void drawline(bufferedimage image){
int num=3;//一共画3条
graphics2d g2=(graphics2d) image.getgraphics();
for(int i=0;i<num;i++){//随机生成坐标,即4个值
int x1=r.nextint(w);
int y1=r.nextint(h);
int x2=r.nextint(w);
int y2=r.nextint(h);
g2.setstroke(new basicstroke(1.5f));//设置笔画的宽度
  g2.setcolor(color.blue);//干扰线颜色
  g2.drawline(x1, y1, x2, y2);//画线
}
}

//随机生成一个字符
private char randomchar(){
int index=r.nextint(codes.length());
return codes.charat(index);
}

//创建bufferedimage
private bufferedimage createimage(){
bufferedimage image=new bufferedimage(w,h,bufferedimage.type_int_rgb);
graphics2d g2=(graphics2d) image.getgraphics();
g2.setcolor(this.bgcolor);
g2.fillrect(0, 0, w, h);
return image;
}

//外界调用这个方法得到验证码
public bufferedimage getimage(){
bufferedimage image=createimage();//创建图片缓冲区
graphics2d g2=(graphics2d)image.getgraphics();//得到绘制环境
stringbuilder sb=new stringbuilder();//用来装载生成的验证码文本
//向图中画4个字符
for(int i=0;i<4;i++){//循环4次
string s=randomchar()+"";//随机生成一个字符
sb.append(s);//把字母添加到sb中
double x=i*1.0*w/4;//设置当前字符的x轴坐标
g2.setfont(randomfont());//设置随机字体
g2.setcolor(randomcolor());//设置随机颜色
g2.drawstring(s, (int)x, h-5);
}
this.text=sb.tostring();//把生成的字符串赋给了this.text
drawline(image);//添加干扰线
return image;
}

//返回验证码图片上面的文本
public string gettext(){
return text;
}

//保存图片到指定的输出流
public static void output(bufferedimage image,outputstream out) throws ioexception{
imageio.write(image, "jpeg", out);
}
}

2、在jsp页面上应用:

其核心代码如下:

<form action="/test/loginservlet" method="post">
   用户名:<input type="text" name="username" value="<%=uname %>"><br>
   密 码:<input type="password" name="password"><br>
   验证码:<input type="text" name="verifycode">
  <img id="img" src="/test/verifycodeservlet">
  <a href="javascript:_change()" rel="external nofollow" >看不清换一张</a><br>
  <input type="submit" value="登录">
 </form>

看不清换一张使用javascript实现,代码如下:

   <script type="text/javascript">
      function _change(){
        /**
        *1.得到image图片
        *2.修改其src为/test/verifycodeservlet 
        */
        var imgele=document.getelementbyid("img");
        imgele.src="/test/verifycodeservlet?a="+new date().gettime();

      }
  </script>

 +new date().gettime()这条语句可以欺骗浏览器,以为请求是新的,实现验证码的改变。

3、在第2步中,verifycodeservlet的实现生成一张验证码,并且通过session域保存验证码图片对应的文本内容,为后面的登录验证验证码是否正确做准备。核心代码如下:

public class verifycodeservlet extends httpservlet {


public void doget(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {


/*
* 1.生成图片
* 2.保存图片上的文本到session域中
* 3.把图片响应给客户端
*/
verifycode vc=new verifycode();
bufferedimage image=vc.getimage();
//保存图片上的文本到session域
request.getsession().setattribute("session_code", vc.gettext());

verifycode.output(image, response.getoutputstream());

  }
}

4、最后一步,实现登录验证验证码是否正确,其核心代码如下:

public class loginservlet extends httpservlet {
public void dopost(httpservletrequest request, httpservletresponse response)
throws servletexception, ioexception {


/*
* 校验验证码
* 1.从session中获取正取的验证码
* 2.从表单中获取用户填写的验证码
* 3.进行比较
* 4.如果相同,向下运行,否则保存错误信息到request域,转发到login.jsp
*/
string sessioncode=(string)                    

 request.getsession().getattribute("session_code");//获得的验证码里面对应的文本内容
string paramcode=request.getparameter("verifycode");//用户输入文本框里面的内容
if(!paramcode.equalsignorecase(sessioncode)){
request.setattribute("msg", "验证码错误!");
request.getrequestdispatcher("/login.jsp").forward(request, response);//打回到登录界面。
return;//返回,不继续执行下面的语句。
}
}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。