Java Web - Google App Engine integrate ReCaptcha

Google App Engine已推知有年,之前研究所時有帶學弟去實作此雲端平台的應用,而現階段

因為此為免費之平台,且近半年也有學寫簡單的JSP/Servlet code,所以想說做個小工具供自

己使用。

雖然GAE為免費的平台,但總是會對原本開發的環境給予一些限制,這些細部資料都可以去

官網查詢。如在此我使用Java來實作,某些原本JDK提供的API就無法使用了,因此在這邊我

雖然整合了ReCaptcha來做驗證碼輸入,不過是侷限在剛好這個plugin是google推的,一開始是

打算使用SimpleCaptcha,不過剛好java.awt.image.BufferedImage不支援,因此就選擇此囉!

1. 首先可以自https://code.google.com/p/recaptcha/downloads/list?q=label:java-Latest下載Library

2. 下載好請放至war\WEB-INF\lib內,並且加至Eclipse - Java Build Path內

3. 至於前端的code

  1.    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
  2.    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>
  3. .....
  4.    <form>
  5.    <%
  6. .......
  7. ReCaptcha c = ReCaptchaFactory.newReCaptcha(
  8. LifeToolUtil.ReCaptcha_public_key,
  9. LifeToolUtil.ReCaptcha_private_key, false);
  10. out.print(c.createRecaptchaHtml(null, null));
  11.    %>
  12.    </form>

LifeToolUtil.ReCaptcha_public_key, LifeToolUtil.ReCaptcha_private_key為我所定義的

class LifeToolUtil內的field,而此key您可以自此頁面取得,如下圖



 在前端此時您可以得到如下畫面


4. 改變 ReCaptcha的樣式其實很容易,請在JavaScript code內加入此段

  1. var RecaptchaOptions = {
  2. theme : 'clean'
  3. };

5. 再來就是當送出表單時,後端code的處理,如下:

  1. String remoteAddr = req.getRemoteAddr();
  2. String challenge = req.getParameter("recaptcha_challenge_field");
  3. String uresponse = req.getParameter("recaptcha_response_field");
  4. try {
  5. if(LifeToolUtil.check_ReCaptcha_answer(remoteAddr, challenge, uresponse)){
  6. memberservice.addMember(member);
  7. resp.sendRedirect("index.html");
  8. }else{
  9. throw new RuntimeException("驗證碼輸入錯誤!", new Throwable("answer_error"));
  10. }
  11. }catch (Throwable e) {
  12. req.setAttribute(e.getCause().getMessage(), e.getMessage());
  13. //out.println(e.getMessage());
  14. req.getRequestDispatcher("/register.jsp").forward(req, resp);
  15. }

先取得這三個值(remoteAddr, challenge, uresponse),如此方可以利用ReCaptcha的method來驗

證是否正確!一樣地利用自定義的LifeToolUtil class的method check_ReCaptcha_answer來幫我

檢驗,method code如下:

  1. public static boolean check_ReCaptcha_answer(String remoteAddr, 
  2. String challenge, String uresponse){
  3. ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
  4. reCaptcha.setPrivateKey(ReCaptcha_private_key);
  5. ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);
  6. return reCaptchaResponse.isValid();
  7. }

在此只是將官方提供的code把他包成我想使用的方式,並沒有做多大的變化!

參考網址如下:https://developers.google.com/recaptcha/docs/java

注意!!  最後Deploy to App Engine時,記得要申請過新的Key(由於Domain不一樣)

留言