發現這個社區不錯,所以也湊個熱鬧。
第一篇日志,一定要動手寫才有誠意。
這兩天要給剛做的外網系統登錄頁面加驗證碼,以前沒做過。上網搜了一下,資料很多。<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byName"> <bean id="captchaServlet" class="com.jawava.XXXX.XXX.TopImageCaptchaServlet" /> <bean id="captchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService"> <description>驗證碼服務</description> <constructor-arg index="0"><ref bean="imageEngine"/></constructor-arg> <constructor-arg index="1"><value>300</value></constructor-arg><!--超時時間 秒--> <constructor-arg index="2"><value>20000</value></constructor-arg><!--最大并發數--> <constructor-arg index="3"><value>20000</value></constructor-arg>& lt;!--第四個參數官網示例上沒有給出,會報錯,后來看了API才知道少了個參數--> </bean> <bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine"> <description>圖片引擎</description> <constructor-arg index="0"> <list> <ref bean="CaptchaFactory"/> </list> </constructor-arg> </bean> <bean id="CaptchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory" > <description>驗證碼工廠</description> <constructor-arg><ref bean="wordgen"/></constructor-arg> <constructor-arg><ref bean="wordtoimage"/></constructor-arg> </bean> <bean id="wordgen" class= "com.octo.captcha.component.word.wordgenerator.RandomWordGenerator" > <description>文字產生器,提供了好幾種實現,經過比較選用了這種</description> <constructor-arg index="0"><value>0123456789</value></constructor-arg> </bean> <bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage" > <description>圖片生成器</description> <constructor-arg index="0"><ref bean="fontGenRandom"/></constructor-arg> <constructor-arg index="1"><ref bean="backGenUni"/></constructor-arg> <constructor-arg index="2"><ref bean="simpleWhitePaster"/></constructor-arg> </bean> <bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator" > <description>文字轉換圖片</description> <constructor-arg index="0"><value>20</value></constructor-arg><!--字體最小尺寸--> <constructor-arg index="1"><value>20</value></constructor-arg><!--字體最大尺寸--> </bean> <bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator" > <constructor-arg index="0"><value>62</value></constructor-arg><!--背景圖片寬度--> <constructor-arg index="1"><value>22</value></constructor-arg><!--背景圖片高度--> <constructor-arg type="java.awt.Color" index="2"> <ref bean="colorGrey"/> </constructor-arg> <constructor-arg type="java.awt.Color" index="3"> <ref bean="colorGreen"/> </constructor-arg> </bean> <bean id="simpleWhitePaster" class="com.octo.captcha.component.image.textpaster.SimpleTextPaster" > <constructor-arg type="java.lang.Integer" index="0"> <value>4</value><!--字符最少個數--> </constructor-arg> <constructor-arg type="java.lang.Integer" index="1"> <value>4</value><!--字符最多個數--> </constructor-arg> <constructor-arg type="java.awt.Color" index="2"> <ref bean="colorFont"/> </constructor-arg> </bean> <bean id="colorGrey" class="java.awt.Color" > <constructor-arg index="0"><value>200</value></constructor-arg> <constructor-arg index="1"><value>255</value></constructor-arg> <constructor-arg index="2"><value>200</value></constructor-arg> </bean> <bean id="colorGreen" class="java.awt.Color" > <constructor-arg index="0"><value>110</value></constructor-arg> <constructor-arg index="1"><value>120</value></constructor-arg> <constructor-arg index="2"><value>200</value></constructor-arg> </bean> <bean id="colorFont" class="java.awt.Color" > <constructor-arg index="0"><value>60</value></constructor-arg> <constructor-arg index="1"><value>60</value></constructor-arg> <constructor-arg index="2"><value>60</value></constructor-arg> </bean> </beans> |
@Override public void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException, RuntimeException { byte[] captchaChallengeAsJpeg = null; //輸出jpg的字節流 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 = (BufferedImage) captchaService.getChallengeForID(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(); } |
<servlet> <servlet-name>CaptchaProxy</servlet-name> <servlet-class>com.jawava.XXXXX.XXX.TopHttpServletProxy</servlet-class> <init-param> <param-name>targetServlet</param-name> <param-value>captchaServlet</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>CaptchaProxy</servlet-name> <url-pattern>/topJcaptcha</url-pattern> </servlet-mapping> |
Boolean isResponseCorrect =Boolean.FALSE; //需要sessionId 來驗證校驗碼 String sessionId = request.getSession().getId(); //首先校驗驗證碼 try { isResponseCorrect = captchaService.validateResponseForID(sessionId, captcha_input); if(!isResponseCorrect) { throw new RuntimeException("輸入的驗證碼有誤,請重新輸入"); } } catch (CaptchaServiceException e) { //should not happen, may be thrown if the id is not valid throw new RuntimeException("校驗驗證碼時出現不明錯誤",e); } |