欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

jfinal添加jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法

 更新時(shí)間:2014年01月11日 09:19:20   作者:  
這篇文章主要介紹了jfinal的jcaptcha驗(yàn)證碼實(shí)現(xiàn)方法,大家參考使用吧

復(fù)制代碼 代碼如下:

package com.g.core.common.JCaptcha;

import java.awt.Color;
import java.awt.Font;

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.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;

/**
 * 生成驗(yàn)證碼圖片
 */

public class JCaptchaEngine extends ListImageCaptchaEngine {

 public static final String IMAGE_CAPTCHA_KEY = "imageCaptcha";// ImageCaptcha對(duì)象存放在Session中的key
 public static final String CAPTCHA_INPUT_NAME = "j_captcha";// 驗(yàn)證碼輸入表單名稱
 public static final String CAPTCHA_IMAGE_URL = "/captcha.jpg";// 驗(yàn)證碼圖片URL
 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 = 28;// 驗(yàn)證碼圖片高度
 private static final Integer IMAGE_WIDTH = 80;// 驗(yàn)證碼圖片寬度
 private static final Integer MIN_FONT_SIZE = 16;// 驗(yàn)證碼最小字體
 private static final Integer MAX_FONT_SIZE = 16;// 驗(yàn)證碼最大字體
 private static final String RANDOM_WORD = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 隨機(jī)字符
 private static final String IMAGE_PATH = "./captcha/";// 隨機(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)
 };

 // 生成驗(yàn)證碼
 @Override
 protected void buildInitialFactories() {

  RandomListColorGenerator randomListColorGenerator = new RandomListColorGenerator(RANDOM_COLOR);

  BackgroundGenerator backgroundGenerator = new FileReaderRandomBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_PATH);

  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));
 }

}

復(fù)制代碼 代碼如下:

package com.g.core.common.JCaptcha;

import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;

public class CaptchaServiceSingleton {

 private static  ImageCaptchaService  instance =null;

 public CaptchaServiceSingleton() {
 }

 // 使用synchronized關(guān)鍵字解決線程不安全
 public synchronized static ImageCaptchaService getInstance() {
  if (instance == null) {
   instance = new DefaultManageableImageCaptchaService(new FastHashMapCaptchaStore(), new JCaptchaEngine(), 180, 
                 100000 , 75000);
  }
  return instance;
 }

}

復(fù)制代碼 代碼如下:

package com.g.core.render;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;

import com.g.core.common.JCaptcha.CaptchaServiceSingleton;
import com.jfinal.kit.StringKit;
import com.jfinal.render.Render;

public class JCaptchaRender extends Render {

 private String randomCodeKey;
 public JCaptchaRender(String randomCodeKey) {
  if (StringKit.isBlank(randomCodeKey))
   throw new IllegalArgumentException("randomCodeKey can not be blank");
  this.randomCodeKey = randomCodeKey;
 }
 @Override
 public void render() {
  response.setHeader("Cache-Control", "no-store");
  response.setHeader("Pragma", "no-cache");
  response.setDateHeader("Expires", 0);
  response.setContentType("image/jpeg");
  ServletOutputStream sos = null;
  try {
   sos = response.getOutputStream();
//   String captchaId = request.getSession(true).getId();
   BufferedImage challenge = (BufferedImage) CaptchaServiceSingleton.getInstance().getChallengeForID(randomCodeKey, request.getLocale());
   ImageIO.write(challenge, "jpg", sos);
   sos.flush();
  } catch (Exception e) {
   throw new RuntimeException(e);
  }
  finally {
   if (sos != null)
    try {sos.close();} catch (IOException e) {e.printStackTrace();}
  }
 }

}

復(fù)制代碼 代碼如下:

public void random_code() {
     render(new JCaptchaRender(getSession().getId()));
 }

相關(guān)文章

  • mybatis?獲取更新(update)記錄的id之<selectKey>用法說明

    mybatis?獲取更新(update)記錄的id之<selectKey>用法說明

    這篇文章主要介紹了mybatis?獲取更新(update)記錄的id之<selectKey>用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • java開發(fā)MVC三層架構(gòu)上再加一層Manager層原理詳解

    java開發(fā)MVC三層架構(gòu)上再加一層Manager層原理詳解

    這篇文章主要為大家介紹了MVC三層架構(gòu)中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Java語言實(shí)現(xiàn)二叉堆的打印代碼分享

    Java語言實(shí)現(xiàn)二叉堆的打印代碼分享

    這篇文章主要介紹了Java語言實(shí)現(xiàn)二叉堆的打印代碼分享,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java String字符串和Unicode字符相互轉(zhuǎn)換代碼

    Java String字符串和Unicode字符相互轉(zhuǎn)換代碼

    這篇文章主要介紹了Java String字符串和Unicode字符相互轉(zhuǎn)換代碼,需要的朋友可以參考下
    2014-10-10
  • Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來減少頻繁創(chuàng)建對(duì)象的性能開銷,java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫連接池、線程池等,下面就來具體講講
    2023-05-05
  • Java?Elastic-Job分布式定時(shí)任務(wù)使用方法介紹

    Java?Elastic-Job分布式定時(shí)任務(wù)使用方法介紹

    xxl-job?通過一個(gè)中心式的調(diào)度平臺(tái),調(diào)度多個(gè)執(zhí)行器執(zhí)行任務(wù),調(diào)度中心通過?DB?鎖保證集群分布式調(diào)度的一致性,這樣擴(kuò)展執(zhí)行器會(huì)增大?DB?的壓力,然而大部分公司的任務(wù)數(shù),執(zhí)行器并不多;xxl-job?提供了非常好用的監(jiān)控頁面甚至還有任務(wù)失敗的郵件告警功能
    2023-01-01
  • springmvc流程圖以及配置解析

    springmvc流程圖以及配置解析

    這篇文章主要介紹了springmvc流程圖以及配置解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn)

    IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn)

    這篇文章主要介紹了IDEA 中創(chuàng)建SpringBoot 父子模塊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • java解析XML Node與Element的區(qū)別(推薦)

    java解析XML Node與Element的區(qū)別(推薦)

    下面小編就為大家分享一篇java解析XML Node與Element的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Java?Mybatis框架由淺入深全解析中篇

    Java?Mybatis框架由淺入深全解析中篇

    MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)jdbc的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費(fèi)精力去處理例如注冊(cè)驅(qū)動(dòng)、創(chuàng)建connection、創(chuàng)建statement、手動(dòng)設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過程代碼本文將為大家深入的介紹一下MyBatis的使用
    2022-07-07

最新評(píng)論