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

   <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
   <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>
   .....
   <form>
   <%
        .......
        ReCaptcha c = ReCaptchaFactory.newReCaptcha(
                           LifeToolUtil.ReCaptcha_public_key,
                           LifeToolUtil.ReCaptcha_private_key, false);
        out.print(c.createRecaptchaHtml(null, null));
   %>
   </form>

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

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



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


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

var RecaptchaOptions = {
   theme : 'clean'
};

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

String remoteAddr = req.getRemoteAddr();
  String challenge = req.getParameter("recaptcha_challenge_field");
  String uresponse = req.getParameter("recaptcha_response_field");

  try {
    if(LifeToolUtil.check_ReCaptcha_answer(remoteAddr, challenge, uresponse)){
        memberservice.addMember(member);
        resp.sendRedirect("index.html");
    }else{
        throw new RuntimeException("驗證碼輸入錯誤!", new Throwable("answer_error"));
    }
   }catch (Throwable e) {
       req.setAttribute(e.getCause().getMessage(), e.getMessage());
       //out.println(e.getMessage());
       req.getRequestDispatcher("/register.jsp").forward(req, resp);
   }

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

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

檢驗,method code如下:

public static boolean check_ReCaptcha_answer(String remoteAddr, 
                String challenge, String uresponse){
  ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
  reCaptcha.setPrivateKey(ReCaptcha_private_key);
  ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);
  return reCaptchaResponse.isValid();
}

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

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

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

留言