Java动态验证码单线设计的两种方法

 更新时间:2018年07月23日 09:46:37   作者:垂眸爱笑约  
这篇文章主要介绍了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动态验证码单线设计的两种方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • javaweb上传下载实例完整版解析(下)

    javaweb上传下载实例完整版解析(下)

    这篇文章主要为大家详细解析了javaweb上传下载实例,本文重点在于文件下载功能的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • SpringBoot JdbcTemplate批量操作的示例代码

    SpringBoot JdbcTemplate批量操作的示例代码

    本篇文章主要介绍了SpringBoot JdbcTemplate批量操作的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • MyBatis-Plus 实体类注解的实现示例

    MyBatis-Plus 实体类注解的实现示例

    MyBatis-Plus作为MyBatis的增强版,提供了一系列实用的注解,如@TableName、@TableId、@TableField等,旨在简化数据库和Java实体类之间的映射及CRUD操作,通过这些注解,开发者可以轻松实现表映射、字段映射、逻辑删除、自动填充和乐观锁等功能
    2024-09-09
  • Java中new关键字和newInstance方法的区别分享

    Java中new关键字和newInstance方法的区别分享

    在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法一个是关键字外,最主要的区别是创建对象的方式不同
    2013-07-07
  • SpringBoot重启后,第一次请求接口请求慢的问题及解决

    SpringBoot重启后,第一次请求接口请求慢的问题及解决

    这篇文章主要介绍了SpringBoot重启后,第一次请求接口请求慢的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • java.lang.OutOfMemoryError: Metaspace异常解决的方法

    java.lang.OutOfMemoryError: Metaspace异常解决的方法

    这篇文章主要介绍了java.lang.OutOfMemoryError: Metaspace异常解决的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Gradle相对于Maven有哪些优点

    Gradle相对于Maven有哪些优点

    这篇文章主要介绍了Gradle相对于Maven有哪些优点,帮助大家选择合适的自动构建工具,更好的构建项目,感兴趣的朋友可以了解下
    2020-10-10
  • java 判断一个数是否为2的整数次幂方法

    java 判断一个数是否为2的整数次幂方法

    今天小编就为大家分享一篇java 判断一个数是否为2的整数次幂方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Springboot如何解决前端请求跨域的问题

    Springboot如何解决前端请求跨域的问题

    这篇文章主要介绍了Springboot如何解决前端请求跨域的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 详解springMVC容器加载源码分析

    详解springMVC容器加载源码分析

    这篇文章主要介绍了详解springMVC容器加载源码分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论