溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java怎么實現(xiàn)動態(tài)驗證碼單線設計

發(fā)布時間:2021-05-24 16:59:28 來源:億速云 閱讀:126 作者:Leah 欄目:編程語言

使用Java怎么實現(xiàn)動態(tài)驗證碼單線設計?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.java的動態(tài)驗證碼我這里將介紹兩種方法:

一:根據(jù)java本身提供的一種驗證碼的寫法,這種呢只限于大家了解就可以了,因為java自帶的模式編寫的在實際開發(fā)中是沒有意義的,所以只供學習一下就可以了,待會講解的第二種呢就是我們需要掌握的一種模式了:

第一種的代碼如下:

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);      
  }
  /**動態(tài)生成圖片驗證碼
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    //創(chuàng)建圖像
    int width=100;
    int height=40;
    //圖片的大小設置
    BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //創(chuàng)建畫板    
    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調(diào)用
    HttpSession se=request.getSession();
    se.setAttribute("number", sb.toString());
    //發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
    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)
  { // 隨機產(chǎn)生干擾點
    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)); 
    } 
  }
/**
 * 隨機產(chǎn)生干擾線條
 * @param width
 * @param height
 * @param minMany 最少產(chǎn)生的數(shù)量
 * @param g
 * @param alpha 透明度0~255 0表示全透
 */
  private void CreateRandomLine(int width,int height,int minMany,Graphics g,int alpha)
  { // 隨機產(chǎn)生干擾線條
    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);
    } 
  }
  /**
   * 由隨機產(chǎn)生的方塊來作為干擾背景
   */
  private void setSquareBackGround(Graphics g,int width,int height,int count){
    // 隨機產(chǎn)生干擾線條
    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;
  }

上面的代碼呢寫的很詳細了,這里我就不重復了,這里的干擾線條是有很多寫法的,我這里就沒有全寫出來,有需要的話可以私聊我哦!

下面介紹第二種:

這種呢是我們開發(fā)中是可以用得到的,使用在的是網(wǎng)頁端的交互,我們在登錄網(wǎng)站的時候有很多的驗證碼就可以用這個來寫了

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);      
  }
  /**動態(tài)生成圖片驗證碼
   * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
   */
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    //創(chuàng)建圖像
    int width=100;
    int height=40;
    //圖片的大小設置
    BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
    //創(chuàng)建畫板    
    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調(diào)用
    HttpSession se=request.getSession();
    se.setAttribute("number", sb.toString());
    //發(fā)送圖片到瀏覽器 指定發(fā)送的圖片 和格式
    response.setContentType("image/jpeg");
    //圖片,圖片的格式,輸出的方式
    ImageIO.write(image, "jpg", response.getOutputStream());
  }

Java可以用來干什么

Java主要應用于:1. web開發(fā);2. Android開發(fā);3. 客戶端開發(fā);4. 網(wǎng)頁開發(fā);5. 企業(yè)級應用開發(fā);6. Java大數(shù)據(jù)開發(fā);7.游戲開發(fā)等。

看完上述內(nèi)容,你們掌握使用Java怎么實現(xiàn)動態(tài)驗證碼單線設計的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI