最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Java驗(yàn)證碼生成庫(kù)JCaptcha

 更新時(shí)間:2016年07月27日 14:49:18   投稿:daisy  
JCaptcha 是一個(gè)用來(lái)生成驗(yàn)證碼的開(kāi)源Java類(lèi)庫(kù),使用起來(lái)也是非常的簡(jiǎn)單方便。本文通過(guò)代碼實(shí)例介紹了JCaptcha類(lèi)庫(kù)。

JCaptcha是非常強(qiáng)大的,不光是可以生成圖片式的驗(yàn)證碼,還可以生成聲音式的(新浪就使用了雙重驗(yàn)證碼)。本文簡(jiǎn)單的介紹了JCaptcha庫(kù)以及使用實(shí)例,下面一起來(lái)看看。

下載JCaptcha庫(kù)

maven依賴(lài)如此添加:

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

封裝了一個(gè)簡(jiǎn)單的類(lèi)

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.*;

/**
 * 產(chǎn)生驗(yàn)證碼圖片的類(lèi)
 */
public class CapchaHelper {
  private static final Integer MIN_WORD_LENGTH = 4;// 驗(yàn)證碼最小長(zhǎng)度
  private static final Integer MAX_WORD_LENGTH = 4;// 驗(yàn)證碼最大長(zhǎng)度
  private static final Integer IMAGE_HEIGHT = 30;// 驗(yàn)證碼圖片高度
  private static final Integer IMAGE_WIDTH = 130;// 驗(yàn)證碼圖片寬度
  private static final Integer MIN_FONT_SIZE = 15;// 驗(yàn)證碼最小字體
  private static final Integer MAX_FONT_SIZE = 15;// 驗(yàn)證碼最大字體
  private static final String RANDOM_WORD = "0123456789";// 隨機(jī)字符

  // 驗(yàn)證碼隨機(jī)字體
  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)
  };

  // 驗(yàn)證碼隨機(jī)顏色
  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;
  }
}

響應(yīng)網(wǎng)頁(yè)中對(duì)驗(yàn)正碼圖像的請(qǐng)求

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

那么在響應(yīng)對(duì)這個(gè)路徑的請(qǐng)求的Servlet中可以這樣寫(xiě):

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

如果用springMVC,就這樣寫(xiě):

//獲取驗(yàn)證碼背景圖片的路徑,這路徑放了很多作為背景的圖像
    String captcha_backgrounds = session.getServletContext().getRealPath("/WEB-INF/img/captcha");
    CaptchaEngine ce = CapchaHelper.getCaptchaEngine(captcha_backgrounds);
    //需要admin網(wǎng)頁(yè)中用js定時(shí)從服務(wù)端獲取當(dāng)前的驗(yàn)證碼
    Captcha captcha = ce.getNextCaptcha();
    //為了驗(yàn)證,把captcha對(duì)象放到session中,以在客戶(hù)端提交驗(yàn)證碼時(shí)進(jìn)行驗(yàn)證
    session.setAttribute("captcha", captcha);
    //獲取驗(yàn)證碼圖片,這是未壓縮的位圖
    BufferedImage image = (BufferedImage) captcha.getChallenge();
    ByteArrayOutputStream bao=new ByteArrayOutputStream();
    //應(yīng)縮成jpg并寫(xiě)到輸出流中
    ImageIO.write(image, "jpg", bao);
    return bao.toByteArray();

這兩種方式,向客戶(hù)端返回的都是二進(jìn)制數(shù)據(jù)。

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

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

網(wǎng)頁(yè)中用 <IMG> 指向這個(gè)地址

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

js函數(shù)refreshCaptchaImg()響應(yīng)圖片的點(diǎn)擊,每點(diǎn)擊一次,就重新獲取一張新的驗(yàn)證碼圖片。如何重新獲取驗(yàn)正碼圖片呢?

只需改變img的src屬性,但這里是每次都是用同一個(gè)地址來(lái)設(shè)置這個(gè)屬性,這樣不會(huì)引起真正的刷新,所以方法refreshCaptchaImg()是這樣實(shí)現(xiàn)的:

function refreshCaptchaImg() {
      //從服務(wù)端重新下載驗(yàn)證碼圖片
      //給這個(gè)地加參數(shù)純?yōu)榱藦?qiáng)制刷新,否則由于src指向的url地址沒(méi)變,瀏覽器不會(huì)真正生刷新圖片
      var now = new Date()
      $("#captcha").attr("src","/captcha_img?"+now.getTime());

以上就是Java中驗(yàn)證碼生成庫(kù)JCaptcha的介紹及使用,希望對(duì)大家學(xué)習(xí)java有所幫助。

相關(guān)文章

  • 淺談JVM系列之JIT中的Virtual Call

    淺談JVM系列之JIT中的Virtual Call

    什么是Virtual Call?Virtual Call在java中的實(shí)現(xiàn)是怎么樣的?Virtual Call在JIT中有沒(méi)有優(yōu)化?所有的答案看完這篇文章就明白了。
    2021-06-06
  • Java中反射reflect的基礎(chǔ)知識(shí)講解

    Java中反射reflect的基礎(chǔ)知識(shí)講解

    這篇文章主要介紹了Java中反射reflect的基礎(chǔ)知識(shí)講解,Java中的反射,它算是Java當(dāng)中非常底層的一個(gè)技術(shù),平時(shí)我們我們用得不多,實(shí)際上它也的確非常復(fù)雜同時(shí)也難以理解,但是涉及到底層的東西Java都給我們封裝好了,我們直接拿來(lái)調(diào)用即可,需要的朋友可以參考下
    2023-10-10
  • Mybatis-Plus接口BaseMapper與Services使用詳解

    Mybatis-Plus接口BaseMapper與Services使用詳解

    這篇文章主要為大家介紹了Mybatis-Plus接口BaseMapper與Services使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 編寫(xiě)Java代碼制造一個(gè)內(nèi)存溢出的情況

    編寫(xiě)Java代碼制造一個(gè)內(nèi)存溢出的情況

    這篇文章主要介紹了編寫(xiě)Java代碼制造一個(gè)內(nèi)存溢出的情況,或許這種有意制造能夠更好地幫助理解Java中的內(nèi)存溢出情況XD 需要的朋友可以參考下
    2015-07-07
  • Java 裝箱與拆箱詳解及實(shí)例代碼

    Java 裝箱與拆箱詳解及實(shí)例代碼

    這篇文章主要介紹了Java 裝箱與拆箱詳解及實(shí)例代碼的相關(guān)資料,這里對(duì)java 的裝箱及拆箱進(jìn)行了基本概念詳解及簡(jiǎn)單使用,需要的朋友可以參考下
    2017-01-01
  • java動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路

    java動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路

    本文主要介紹了java?動(dòng)態(tài)線程池的簡(jiǎn)單實(shí)現(xiàn)思路,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過(guò)程

    springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過(guò)程

    這篇文章主要給大家介紹了關(guān)于springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過(guò)程,Spring Boot應(yīng)用中可以配置多個(gè)數(shù)據(jù)源,并根據(jù)注解靈活指定當(dāng)前使用的數(shù)據(jù)源,需要的朋友可以參考下
    2023-08-08
  • 解決java文件流處理異常 mark/reset not supported問(wèn)題

    解決java文件流處理異常 mark/reset not supported問(wèn)題

    這篇文章主要介紹了解決java文件流處理異常 mark/reset not supported問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Java中過(guò)濾器 (Filter) 和 攔截器 (Interceptor)的使用

    Java中過(guò)濾器 (Filter) 和 攔截器 (Interceptor)的使用

    這篇文章主要介紹了Java中過(guò)濾器 (Filter) 和 攔截器 (Interceptor)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 一文帶你弄懂Maven拉包(拉取依賴(lài)包)原理

    一文帶你弄懂Maven拉包(拉取依賴(lài)包)原理

    業(yè)務(wù)需求開(kāi)發(fā)的時(shí)候,我們總是會(huì)遇到拉不到依賴(lài)包的情況,此時(shí)如果不清楚 Maven 拉取依賴(lài)包的原理,那么很可能找不到問(wèn)題所在,今天小編就帶大家了解下 Maven 拉包的原理,讓你在遇到問(wèn)題的時(shí)候能快速解決,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

平潭县| 泰和县| 洛隆县| 富裕县| 秀山| 获嘉县| 东港市| 郸城县| 贵南县| 称多县| 朝阳区| 稻城县| 山丹县| 布尔津县| 台中市| 涞源县| 平阴县| 南漳县| 郓城县| 南雄市| 临朐县| 崇左市| 固镇县| 兴义市| 宁都县| 文安县| 会泽县| 潢川县| 紫阳县| 和政县| 射洪县| 宜兰县| 鄂托克旗| 阿坝县| 荆州市| 贵定县| 彰化县| 山东| 玉门市| 灌阳县| 邹平县|