Java验证码图片生成代码

 更新时间:2017年03月06日 08:37:38   作者:J仓怕加x  
这篇文章主要为大家详细介绍了Java验证码图片生成代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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;//返回,不继续执行下面的语句。
}
}
}

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

相关文章

  • mybatis-plus 插入修改配置默认值的实现方式

    mybatis-plus 插入修改配置默认值的实现方式

    这篇文章主要介绍了mybatis-plus 插入修改配置默认值的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Spring Boot中配置文件application.properties使用

    Spring Boot中配置文件application.properties使用

    这篇文章主要介绍了Spring Boot中配置文件application.properties使用及spring boot读取application.properties文件的方式,需要的朋友参考下吧
    2018-01-01
  • Java的编译时错误和运行时错误问题

    Java的编译时错误和运行时错误问题

    这篇文章主要介绍了Java的编译时错误和运行时错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解Java如何实现FP-Growth算法

    详解Java如何实现FP-Growth算法

    学校里的实验,要求实现FP-Growth算法.FP-Growth算法比Apriori算法快很多(但是却比不上时间)在网上搜索后发现Java实现的FP-Growth算法很少,且大多数不太能理解):太菜.所以就自己实现了一下.这篇文章重点介绍一下我的Java实现 ,需要的朋友可以参考下
    2021-06-06
  • java实现单机限流

    java实现单机限流

    这篇文章主要为大家详细介绍了java实现单机限流,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 使用java基础类实现zip压缩和zip解压工具类分享

    使用java基础类实现zip压缩和zip解压工具类分享

    使用java基础类写的一个简单的zip压缩解压工具类,实现了指定目录压缩到和该目录同名的zip文件和将zip文件解压到指定的目录的功能
    2014-03-03
  • 微信支付H5调用支付详解(java版)

    微信支付H5调用支付详解(java版)

    本篇文章主要介绍了微信支付H5调用支付详解,小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-12-12
  • Java监听器三种实现方法代码解析

    Java监听器三种实现方法代码解析

    这篇文章主要介绍了Java监听器三种实现方法代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 基于Retrofit+Rxjava实现带进度显示的下载文件

    基于Retrofit+Rxjava实现带进度显示的下载文件

    这篇文章主要为大家详细介绍了基于Retrofit+Rxjava实现带进度显示的下载文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 一文讲通Java为什么不支持多继承原理

    一文讲通Java为什么不支持多继承原理

    这篇文章主要为大家介绍了java为什么不支持多继承原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论