淺析Java驗證碼產生庫JCaptcha_java

來源:互聯網
上載者:User

JCaptcha是非常強大的,不光是可以產生圖片式的驗證碼,還可以產生聲音式的(新浪就使用了雙步驟驗證碼)。本文簡單的介紹了JCaptcha庫以及使用執行個體,下面一起來看看。

下載JCaptcha庫

maven依賴如此添加:

<dependency>      <groupId>com.octo.captcha</groupId>      <artifactId>jcaptcha</artifactId>      <version>1.0</version>    </dependency>

封裝了一個簡單的類

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;import com.octo.captcha.component.image.backgroundgenerator.FileReaderRandomBackgroundGenerator;import com.octo.captcha.component.image.color.RandomListColorGenerator;import com.octo.captcha.component.image.fontgenerator.FontGenerator;import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;import com.octo.captcha.component.image.textpaster.TextPaster;import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;import com.octo.captcha.component.image.wordtoimage.WordToImage;import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;import com.octo.captcha.component.word.wordgenerator.WordGenerator;import com.octo.captcha.engine.CaptchaEngine;import com.octo.captcha.engine.image.ListImageCaptchaEngine;import com.octo.captcha.image.gimpy.GimpyFactory;import java.awt.*;/** * 產生驗證碼圖片的類 */public class CapchaHelper {  private static final Integer MIN_WORD_LENGTH = 4;// 驗證碼最小長度  private static final Integer MAX_WORD_LENGTH = 4;// 驗證碼最大長度  private static final Integer IMAGE_HEIGHT = 30;// 驗證碼圖片高度  private static final Integer IMAGE_WIDTH = 130;// 驗證碼圖片寬度  private static final Integer MIN_FONT_SIZE = 15;// 驗證碼最小字型  private static final Integer MAX_FONT_SIZE = 15;// 驗證碼最大字型  private static final String RANDOM_WORD = "0123456789";// 隨機字元  // 驗證碼隨機字型  private static final Font[] RANDOM_FONT = new Font[]{      new Font("nyala", Font.BOLD, MIN_FONT_SIZE),      new Font("Arial", Font.BOLD, MIN_FONT_SIZE),      new Font("Bell MT", Font.BOLD, MIN_FONT_SIZE),      new Font("Credit valley", Font.BOLD, MIN_FONT_SIZE),      new Font("Impact", Font.BOLD, MIN_FONT_SIZE)  };  // 驗證碼隨機顏色  private static final Color[] RANDOM_COLOR = new Color[]{      new Color(255, 255, 255),      new Color(255, 220, 220),      new Color(220, 255, 255),      new Color(220, 220, 255),      new Color(255, 255, 220),      new Color(220, 255, 220)  };  private static ListImageCaptchaEngine captchaEngine;  public static CaptchaEngine getCaptchaEngine(final String imgPath) {    if (captchaEngine == null) {      synchronized (CapchaHelper.class) {        if (captchaEngine == null && imgPath != null) {          captchaEngine = new ListImageCaptchaEngine() {            @Override            protected void buildInitialFactories() {              RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR);              BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, imgPath);              WordGenerator wordGenerator = new RandomWordGenerator(RANDOM_WORD);              FontGenerator fontGenerator = new RandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE, RANDOM_FONT);              TextDecorator[] textDecorator = new TextDecorator[]{};              TextPaster textPaster = new DecoratedRandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, randomListColorGenerator, textDecorator);              WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);              addFactory(new GimpyFactory(wordGenerator, wordToImage));            }          };        }      }    }    return captchaEngine;  }}

響應網頁中對驗正碼映像的請求

可以定義一個servlet響應這個請求,如果用springMVC,也可以用某個Controller中的某個方法響應這個請求,不管怎樣,都需要指定一個路徑對應到servlet或controller的方法,比如路徑是:”/aaa/captcha”

那麼在響應對這個路徑的請求的Servlet中可以這樣寫:

//擷取驗證碼背景圖片的路徑,這路徑放了很多作為背景的映像    String captcha_backgrounds = session.getServletContext().getRealPath("/WEB-INF/img/captcha");    CaptchaEngine ce = CapchaHelper.getCaptchaEngine(captcha_backgrounds);    //需要admin網頁中用js定時從服務端擷取當前的驗證碼    Captcha captcha = ce.getNextCaptcha();    //為了驗證,把captcha對象放到session中,以在用戶端提交驗證碼時進行驗證    req.getSession().setAttribute("captcha", captcha);    //擷取驗證碼圖片,這是未壓縮的位元影像    BufferedImage image = (BufferedImage) captcha.getChallenge();    resp.setContentType("image/jpeg");    ImageIO.write(image, "jpg", resp.getOutputStream());

如果用springMVC,就這樣寫:

//擷取驗證碼背景圖片的路徑,這路徑放了很多作為背景的映像    String captcha_backgrounds = session.getServletContext().getRealPath("/WEB-INF/img/captcha");    CaptchaEngine ce = CapchaHelper.getCaptchaEngine(captcha_backgrounds);    //需要admin網頁中用js定時從服務端擷取當前的驗證碼    Captcha captcha = ce.getNextCaptcha();    //為了驗證,把captcha對象放到session中,以在用戶端提交驗證碼時進行驗證    session.setAttribute("captcha", captcha);    //擷取驗證碼圖片,這是未壓縮的位元影像    BufferedImage image = (BufferedImage) captcha.getChallenge();    ByteArrayOutputStream bao=new ByteArrayOutputStream();    //應縮成jpg並寫到輸出資料流中    ImageIO.write(image, "jpg", bao);    return bao.toByteArray();

這兩種方式,向用戶端返回的都是位元據。

String captcha_backgrounds = session.getServletContext().getRealPath(“/WEB-INF/img/captcha”);

表示路徑/WEB-INF/img/captcha下面放的是作為驗證碼映像的背景的多張圖片,必須是jpeg,大小可能沒限制,你可以自己試一下。

網頁中用 <IMG> 指向這個地址

<img id="captcha" src="/captcha_img" onclick="refreshCaptchaImg()" />

js函數refreshCaptchaImg()響應圖片的點擊,每點擊一次,就重新擷取一張新的驗證碼圖片。如何重新擷取驗正碼圖片呢?

只需改變img的src屬性,但這裡是每次都是用同一個地址來設定這個屬性,這樣不會引起真正的重新整理,所以方法refreshCaptchaImg()是這樣實現的:

function refreshCaptchaImg() {      //從服務端重新下載驗證碼圖片      //給這個地加參數純為了強制重新整理,否則由於src指向的url地址沒變,瀏覽器不會真正生重新整理圖片      var now = new Date()      $("#captcha").attr("src","/captcha_img?"+now.getTime());

以上就是Java中驗證碼產生庫JCaptcha的介紹及使用,希望對大家學習java有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.