jsp驗證碼制作
?
介紹兩個功能強大的開源制作驗證碼組件SimpleCaptcha,JCAPTCHA。
?
一、SimpleCaptcha搜狐郵箱注冊時就使用了該組件,主頁:
??http://simplecaptcha.sourceforge.net/index.html
?
?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/
?
?更多實例可以查看: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()。