1. 程式人生 > >使用jcaptcha外掛生成驗證碼

使用jcaptcha外掛生成驗證碼

 機械鍵盤
圖片
2.建立一個CaptchaServiceSingleton類用來獲取jcaptcha自己實現的預設驗證碼生成器物件DefaultManageableImageCaptchaService(使用單例模式)。
package com.xhc.jcaptcha;

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

public class CaptchaServiceSingleton {
  private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();
 
     public static ImageCaptchaService getInstance(){
         return instance;
     }
}

3.建立處理驗證碼生成的servlet
package com.xhc.jcaptcha;

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

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.octo.captcha.service.CaptchaServiceException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageCaptchaServlet extends HttpServlet {

 public void destroy() {
  super.destroy();
 }
 public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
   throws ServletException, IOException {
    byte[] captchaChallengeAsJpeg = null;
        // the output stream to render the captcha image as jpeg into
         ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
         try {
         // get the session id that will identify the generated captcha.
         //the same id must be used to validate the response, the session id is a good candidate!
         String captchaId = httpServletRequest.getSession().getId();
         // call the ImageCaptchaService getChallenge method
             BufferedImage challenge = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);
                     challenge=CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
                             httpServletRequest.getLocale());
             // a jpeg encoder
             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();
 
         // flush it in the response
         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();
 }

 public void init(ServletConfig servletConfig) throws ServletException {
  super.init(servletConfig);
 }

}



若匯入這兩個類時報錯import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;原因:Eclipse預設把這些受訪問限制的API設成了ERROR。只要把Windows-Preferences-Java-Complicer-Errors/Warnings裡面的Deprecated and restricted API中的Forbidden references(access rules)選為Warning就可以編譯通過。4.建立用來做驗證的servlet
package com.xhc.jcaptcha;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpRetryException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.octo.captcha.service.CaptchaServiceException;

public class ValidationServlet extends HttpServlet {

 public void destroy() {
  super.destroy(); // Just puts "destroy" string in log
  // Put your code here
 }
 public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
   throws ServletException, IOException {
  Boolean isResponseCorrect =Boolean.FALSE;
        //remenber that we need an id to validate!
        String captchaId = httpServletRequest.getSession().getId();
        //retrieve the response
        String response = httpServletRequest.getParameter("j_captcha_response");
        // Call the Service method
        httpServletResponse.setContentType("text/html;charset=utf-8");
       PrintWriter wt=httpServletResponse.getWriter();
       
        try {
             isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,
                     response);
             if(isResponseCorrect){
              wt.write("<a>驗證碼輸入成功</a>");
             }else{
              wt.write("<a>驗證碼輸入失敗</a>");
             }
         } catch (CaptchaServiceException e) {
              //should not happen, may be thrown if the id is not valid
         }
 }

 
 public void init() throws ServletException {
 }

}


5.配置web.xml 
<servlet>
    <servlet-name>ImageCaptchaServlet</servlet-name>
    <servlet-class>com.xhc.jcaptcha.ImageCaptchaServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet>
    <servlet-name>ValidationServlet</servlet-name>
    <servlet-class>com.xhc.jcaptcha.ValidationServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ImageCaptchaServlet</servlet-name>
    <url-pattern>/servlet/ImageCaptchaServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ValidationServlet</servlet-name>
    <url-pattern>/servlet/ValidationServlet</url-pattern>
  </servlet-mapping>


6.jsp頁面
<body>
 <form action="servlet/ValidationServlet" method="GET">
  <input type="text" name="j_captcha_response">
  <img src="servlet/ImageCaptchaServlet" height="50" width="100"> 
  <input type="submit" value="提交" />
 </form>
</body>

相關推薦

使用jcaptcha外掛生成驗證

 2.建立一個CaptchaServiceSingleton類用來獲取jcaptcha自己實現的預設驗證碼生成器物件DefaultManageableImageCaptchaService(使用單例模式)。package com.xhc.jcaptcha; import c

外掛及工具純java生成驗證

1:html頁面 <body> <image id="code" src="DemoServlet"></image> <input type="button" value="看不清,換一張" id="btn" onclick="c

使用JCaptcha生成驗證

使用JCaptcha工具包生成驗證碼 引入Lib包 (包括一些依賴包commons-collections等) 從Servlet看起  <!-- 驗證碼Servlet -->  <servlet>   <servlet-name>jca

使用php如何生成驗證

輸出 fontsize lora 支付 () 頭文件 出圖 and utf 項目中經常會遇到一些登陸驗證,支付驗證等等一系列安全驗證的策略。實現方法多種多樣,下面就來講解下如何用php生成簡單的文字+數字組合的驗證碼: 所用語言php,gd庫 原理解釋: a>實質上

java生成驗證圖片

val ttr attribute cep 隨機字符串 sta random pragma rac public class AuthImg extends HttpServlet { /** * */ privat

php生成驗證 參考PHP手冊

ffffff -type apach ob_clean library bom頭 ear png 手冊 視圖層 復制粘貼就可以 phpStudy2013 GD支持未開啟 解決方法 phpStudyAdmin控制臺 - 配置文件 - php.ini 查找“extension=

C#生成驗證之四位隨機數

返回 args nbsp ica ebo inpu cti spa ini 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using Sys

詳解圖形圖像技術如何生成驗證

mage 隨機數 har 地址 idt session floor oct type 先說一下思路: (1)先做出基本樣式 (2)用圖像處理技術生成驗證碼,並存session (3)註意img的路徑,後面要跟一個隨機數,便於每次刷新時,傳的地址都是不一樣的 (4)用for

Python學習心得(五) random生成驗證、MD5加密、pickle與json的序列化和反序列化

用法 div com ict file imp randint csdn == # -*- coding:utf-8 -*- import random as rd #驗證碼 import hashlib as hsl #MD5加密 import pickle,json

laravel5.4生成驗證

validate jpeg mage 命令 不顯示 ace request 技術 執行c 總結:本篇博客介紹使用gregwar/captcha實現驗證碼的具體操作步驟,以及可能遇到的問題和解決辦法。 操作步驟: 1, 在laravel5.4項目根目錄下找到 composer

隨機生成驗證及python中的事務

join != rst row pda cep 操作 status 隨機 1.隨機生成驗證碼 # import random # print(random.random()) #0-1的小數 # print(random.randint(1,3))

【5】GDI+ 生成驗證

splay 小應用 eric gen 前景 num 微軟 param graphic 這裏我們做一個小應用,就是繪制一個如下圖所示的驗證碼圖片。並且點擊驗證碼的時候會自動切換。 實現思路如下: 通過Random生成隨機數或字符及驗證碼 通過驗證碼內容長度生成指定大小的圖

三條代 搞定 python 生成驗證

python 驗證碼C:\Users\DELL>pythonPython 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32Type "help", "copyright",

Python 生成驗證

blog col log num style class pytho int spa temp2 = "" for i in range(6): num = random.randrange(0,6) if num == 1 or num == 3

python快速生成驗證(密碼)

python隨機生成驗證碼密碼描述:一個簡單的練習生成驗證碼或密碼的小腳本程序,驗證碼廣泛用於web的隨機驗證模塊,也可以通過稍稍改造,達到隨機生成密碼的效果.來看看代碼吧:代碼:def GetCode(num): code = ‘‘ for i in range(num):

java Zing生成驗證

內嵌 hash exc 圖片 || final print pat fin package yanzm;import java.awt.image.BufferedImage; import java.io.File; import java.io.IOExce

前端生成驗證圖片utils

sta substr setfont som 生成 col height log etc <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%

random 模塊,隨機生成驗證

spa print for HR rand 利用 col random range 隨機生成驗證碼: 此功能利用了chr 和random功能 1 res =‘‘ 2 for i in range(6): 3 num = str(random.randint(0,9

隨機生成驗證

else span 生成 check spa ret 驗證 dom code 1 def check_code(): #隨機生成驗證碼 2 import random 3 checkcode = ‘‘ 4 for i in range(4

7月2日 Django 生成驗證

orm with tex quest 大小 obj randint http 得到 html頁面裏 {# 驗證碼 #} <div class="form-group " id="v-code-wrapper"> <label