Terry.Li-彬

          虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks

          jsp驗證碼制作

          ?

            介紹兩個功能強大的開源制作驗證碼組件SimpleCaptcha,JCAPTCHA。

          ?

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

          ?

          example


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

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

          ??<!-- 邊框粗細-->
          ??<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>

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

          ??<!-- 此處可不定義,可在自定義類中定義所有的要顯示的內容 -->
          ??<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>

          ??<!-- 設置圖片顯示內容長度 -->
          ??<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>
          ???<!-- 如果使用中文時設置成中文的字體 -->
          ???<param-value>
          ????Arial,Helvetica,Courier,TimesRoman,宋體,黑體
          ???</param-value>
          ??</init-param>

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

          ??<!-- 設置圖片字體色 -->
          ??<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>

          ??<!--干擾線實現類-->
          ??<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>
          ??以上配置可根據喜好設置。

          ?

          ?2、調用顯示

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

          ?

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

          ?

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

          ?

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


          ?1、配置
          ?下載JCAPTCHA后將jcaptcha.jar和commons-collections-2.1以上.jar(單獨下載,地址: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、編寫一個產生驗證碼的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、在頁面中顯示
          ?<img src="jcaptcha">
          ?<input type='text' name='captcha_code' value=''>

          ?

          ?6、后臺驗證
          ?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
          ??????? }
          ?最簡單的開發過程結束,試運行一下效果!
          ?
          ?注:要實現自己的驗證引擎可以繼承ListImageCaptchaEngine實現抽象方法buildInitialFactories()。

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

          評論

          # re: 利用開源組件制作驗證碼 Captcha 2013-08-29 12:09 ssss
          ggg  回復  更多評論
            

          主站蜘蛛池模板: 抚远县| 阳江市| 福泉市| 太白县| 寿宁县| 东丰县| 高雄市| 陵水| 肇州县| 京山县| 华池县| 定南县| 长垣县| 棋牌| 香港| 顺平县| 巫溪县| 昆山市| 双辽市| 景东| 祁门县| 丰顺县| 德州市| 保山市| 渝北区| 台州市| 鄂托克旗| 新竹市| 西华县| 库伦旗| 贵定县| 沁水县| 青神县| 青铜峡市| 鄄城县| 浦北县| 景宁| 满洲里市| 嵊泗县| 仪征市| 南昌县|