Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks

          jsp驗(yàn)證碼制作

          ?

            介紹兩個(gè)功能強(qiáng)大的開源制作驗(yàn)證碼組件SimpleCaptcha,JCAPTCHA。

          ?

            一、SimpleCaptcha搜狐郵箱注冊(cè)時(shí)就使用了該組件,主頁(yè):
          ??http://simplecaptcha.sourceforge.net/index.html

          ?

          example


          ?1.配置
          ??將下載的jar文件放置工程的lib目錄下,打開工程的web.xml文件加上相應(yīng)的配置
          ?<servlet>
          ??<servlet-name>Captcha</servlet-name>
          ??<servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>
          ??<!--邊框顯示參數(shù)-->
          ??<init-param>
          ???<param-name>cap.border</param-name>
          ???<param-value>yes</param-value>
          ??</init-param>

          ??<!-- 設(shè)置圖片邊框色 -->
          ??<init-param>
          ???<param-name>cap.border.c</param-name>
          ???<param-value>green</param-value>
          ??</init-param>

          ??<!-- 邊框粗細(xì)-->
          ??<init-param>
          ???<param-name>cap.border.th</param-name>
          ???<param-value>1</param-value>
          ??</init-param>

          ??<!-- the image producer. Currently only one-->
          ??<init-param>
          ???<param-name>cap.cap.producer</param-name>
          ???<param-value>
          ????nl.captcha.obscurity.imp.DefaultCaptchaIml
          ???</param-value>
          ??</init-param>

          ??<!-- 設(shè)置驗(yàn)證碼的內(nèi)容 -->
          ??<init-param>
          ???<param-name>cap.text.producer</param-name>
          ???<!--<param-value>Default</param-value>-->
          ???<!-- 此處是我自定義的一個(gè)顯示中文的類 -->
          ???<param-value>org.ChineseTextProducer</param-value>
          ??</init-param>

          ??<!-- 此處可不定義,可在自定義類中定義所有的要顯示的內(nèi)容 -->
          ??<init-param>
          ???<param-name>cap.char.arr</param-name>
          ???<param-value>
          ????2,3,4,6,7,8,9,a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,x,y,z
          ???</param-value>
          ??</init-param>

          ??<!-- 設(shè)置圖片顯示內(nèi)容長(zhǎng)度 -->
          ??<init-param>
          ???<param-name>cap.char.arr.l</param-name>
          ???<param-value>4</param-value>
          ??</init-param>

          ??<init-param>
          ???<param-name>cap.font.arr</param-name>
          ???<!-- 如果使用中文時(shí)設(shè)置成中文的字體 -->
          ???<param-value>
          ????Arial,Helvetica,Courier,TimesRoman,宋體,黑體
          ???</param-value>
          ??</init-param>

          ??<!-- 設(shè)置字體大小 -->
          ??<init-param>
          ???<param-name>cap.font.size</param-name>
          ???<param-value>30</param-value>
          ??</init-param>

          ??<!-- 設(shè)置圖片字體色 -->
          ??<init-param>
          ???<param-name>cap.font.color</param-name>
          ???<param-value>white</param-value>
          ??</init-param>
          ??
          ??<!-- 扭曲; 曲解; 變形 begin -->
          ??<!-- 圖片效果1
          ??<init-param>
          ???<param-name>cap.obscurificator</param-name>
          ???以下任選一
          ???<param-value>nl.captcha.obscurity.imp.ShadowGimpyImp</param-value>
          ???<param-value>nl.captcha.obscurity.imp.WaterRiple</param-value>
          ???<param-value>nl.captcha.sandbox.TestGimpyImp</param-value>
          ??</init-param>
          ??-->
          ??<init-param>
          ???<param-name>cap.obscurificator</param-name>
          ???<param-value>org.FishEyeGimpyImp</param-value>
          ??</init-param>

          ??<init-param>
          ???<param-name>cap.border</param-name>
          ???<param-value>no</param-value>
          ??</init-param>

          ??<init-param>
          ???<param-name>cap.char.arr.l</param-name>
          ???<param-value>6</param-value>
          ??</init-param>

          ??<init-param>
          ???<param-name>cap.background.c.to</param-name>
          ???<param-value>white</param-value>
          ??</init-param>
          ??
          ??<init-param>
          ???<param-name>cap.background.c.from</param-name>
          ???<param-value>white</param-value>
          ??</init-param>
          ??<!--扭曲; 曲解; 變形 end 不想要這種效果可注釋以上代碼-->


          ??<init-param>
          ???<param-name>cap.distortionImp</param-name>
          ???<param-value />
          ??</init-param>

          ??<init-param>
          ???<param-name>cap.backgroundImp</param-name>
          ???<param-value />
          ??</init-param>

          ??<!-- 此處色為漸變的色 -->
          ??<init-param>
          ???<param-name>cap.background.c.to</param-name>
          ???<param-value>black</param-value>
          ??</init-param>

          ??<!-- 圖片左邊色 -->
          ??<init-param>
          ???<param-name>cap.background.c.from</param-name>
          ???<param-value>black</param-value>
          ??</init-param>

          ??<!--干擾線實(shí)現(xiàn)類-->
          ??<init-param>
          ???<param-name>cap.noiseImp</param-name>
          ???<param-value>nl.captcha.obscurity.imp.DefaultNoiseImp</param-value>
          ??</init-param>

          ??<!-- 干擾線色
          ??<init-param>
          ???<param-name>cap.noise.c</param-name>
          ???<param-value>255,245,219</param-value>
          ??</init-param>
          ?? -->
          ?</servlet>
          ?<servlet-mapping>
          ??<servlet-name>Captcha</servlet-name>
          ??<url-pattern>/Captcha.jpg</url-pattern>
          ?</servlet-mapping>
          ??以上配置可根據(jù)喜好設(shè)置。

          ?

          ?2、調(diào)用顯示

          ?在要顯示驗(yàn)證碼的頁(yè)面中加入<img src="Captcha.jpg">即可顯示生成的驗(yàn)證碼

          ?

          ?3、后臺(tái)驗(yàn)證
          ?驗(yàn)證非常簡(jiǎn)單,通過session.getAttribute(nl.captcha.servlet.Constants.SIMPLE_CAPCHA_SESSION_KEY);即可得到組件生成
          的驗(yàn)證碼,然后與前臺(tái)傳遞的用戶填寫的內(nèi)容比較即可。
          ?
          ?注:如果要自定義驗(yàn)證碼的內(nèi)容可以繼承DefaultTextCreator類,覆寫getText()方法即可,方法返回的是一個(gè)字符串。

          ?

            二、JCAPTCHA,該組件功能非常強(qiáng)大,可以生成word、圖片、聲音等驗(yàn)證碼。主頁(yè):
          ?http://forge.octo.com/jcaptcha/confluence/display/general/Home
          ?http://jcaptcha.sourceforge.net/

          ?

          example
          ?更多實(shí)例可以查看:http://forge.octo.com/jcaptcha/confluence/display/general/Samples+tests


          ?1、配置
          ?下載JCAPTCHA后將jcaptcha.jar和commons-collections-2.1以上.jar(單獨(dú)下載,地址:http://commons.apache.org/collections/)放置工程lib目錄下。

          ?

          ?2、Implement a CaptchaService

          ?import com.octo.captcha.service.image.ImageCaptchaService;
          ?import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

          ?public class CaptchaServiceSingleton {

          ???? private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();

          ???? public static ImageCaptchaService getInstance(){
          ??????? ?return instance;
          ??? ?  }
          ?}

          ?

          ?3、編寫一個(gè)產(chǎn)生驗(yàn)證碼的servlet
          ?
          ?public class ImageCaptchaServlet extends HttpServlet {
          ?
          ?protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
          ???????throws ServletException, IOException {

          ??????? byte[] captchaChallengeAsJpeg = null;
          ?????
          ??????? ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
          ??????? try {
          ????? ??String captchaId = httpServletRequest.getSession().getId();
          ???????
          ??????? ?BufferedImage challenge =
          ??????????????????? CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
          ??????????????????????????? httpServletRequest.getLocale());
          ??????????? JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
          ??????????? jpegEncoder.encode(challenge);
          ??????? } catch (IllegalArgumentException e) {
          ??????????? httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
          ??????????? return;
          ??????? } catch (CaptchaServiceException e) {
          ??????????? httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
          ??????????? return;
          ??????? }

          ??????? captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

          ??????? httpServletResponse.setHeader("Cache-Control", "no-store");
          ??????? httpServletResponse.setHeader("Pragma", "no-cache");
          ??????? httpServletResponse.setDateHeader("Expires", 0);
          ??????? httpServletResponse.setContentType("image/jpeg");
          ??????? ServletOutputStream responseOutputStream =
          ??????????????? httpServletResponse.getOutputStream();
          ??????? responseOutputStream.write(captchaChallengeAsJpeg);
          ??????? responseOutputStream.flush();
          ??????? responseOutputStream.close();
          ??? }
          }


          ?4、將servlet添加到web.xml文件中
          ?<servlet>
          ???????? <servlet-name>jcaptcha</servlet-name>
          ??????? ?<servlet-class>ImageCaptchaServlet</servlet-class>
          ???????? <load-on-startup>0</load-on-startup>
          ??????? </servlet>

          ?<servlet-mapping>
          ??????? ?<servlet-name>jcaptcha</servlet-name>
          ???????? <url-pattern>/jcaptcha</url-pattern>
          ?</servlet-mapping>

          ?

          ?5、在頁(yè)面中顯示
          ?<img src="jcaptcha">
          ?<input type='text' name='captcha_code' value=''>

          ?

          ?6、后臺(tái)驗(yàn)證
          ?Boolean isResponseCorrect =Boolean.FALSE;
          ??????? String captchaId = httpServletRequest.getSession().getId();
          ??????? String response = httpServletRequest.getParameter("captcha_code");
          ??????? try {
          ??????????????? isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,response);
          ??????? } catch (CaptchaServiceException e) {
          ??//TODO
          ??????? }
          ?最簡(jiǎn)單的開發(fā)過程結(jié)束,試運(yùn)行一下效果!
          ?
          ?注:要實(shí)現(xiàn)自己的驗(yàn)證引擎可以繼承ListImageCaptchaEngine實(shí)現(xiàn)抽象方法buildInitialFactories()。

          posted on 2009-07-29 10:37 禮物 閱讀(2022) 評(píng)論(1)  編輯  收藏 所屬分類: Jsp

          評(píng)論

          # re: 利用開源組件制作驗(yàn)證碼 Captcha 2013-08-29 12:09 ssss
          ggg  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 大港区| 磐安县| 屏南县| 汾阳市| 大厂| 巴楚县| 南江县| 北京市| 阳西县| 天津市| 长岭县| 绿春县| 黄平县| 旌德县| 北碚区| 嘉峪关市| 晋州市| 泊头市| 陇南市| 康马县| 梁河县| 赣州市| 东源县| 鸡西市| 积石山| 汉源县| 张家口市| 安多县| 开化县| 安龙县| 双城市| 桐梓县| 临海市| 衡阳市| 准格尔旗| 扶绥县| 宕昌县| 成安县| 南和县| 苏尼特右旗| 丰原市|