Google reCAPTCHA Integration in Java Web Application

Ich mochte Captchas nie, weil die Last immer beim Endnutzer lag, die Buchstaben zu verstehen und zu beweisen, dass er ein Mensch und kein Software-Bot ist. Aber als ich kürzlich das neue Google reCAPTCHA auf einer Website gesehen habe, mochte ich es sofort. Denn alles, was wir tun müssen, ist ein Kästchen anzukreuzen, und es erkennt, ob man ein Mensch oder ein Roboter ist. Google nennt es das No CAPTCHA reCAPTCHA-Erlebnis und es verwendet eine fortschrittliche Risikoanalyse-Engine und adaptive CAPTCHAs, um automatisierte Software daran zu hindern, missbräuchliche Aktivitäten auf Ihrer Website durchzuführen.

Einführung in Google reCAPTCHA

Das bildete die Grundlage für diesen Beitrag, in dem ich zeige, wie man Google reCAPTCHA in Ihre Java-basierte Webanwendung integriert. Bevor wir mit unserem Projekt fortfahren, müssen Sie sich zunächst bei Google reCAPTCHA anmelden. Danach erhalten Sie einen Site Key, der zur Anzeige des reCaptcha-Widgets auf Ihren Webseiten verwendet wird. Sie erhalten außerdem einen Secret Key, der geheim gehalten werden sollte und zur Kommunikation mit dem Google-Server zur Überprüfung der Captcha-Antwort dient. Nachdem ich eine Testseite registriert hatte, erhielt ich die unten stehenden Schlüssel und werde sie in meinem Projekt verwenden. Beachten Sie, dass Sie bei der Anmeldung auch den Domainnamen angeben müssen und die Schlüssel nur auf dieser Domain funktionieren. Die Schlüssel funktionieren jedoch immer auf localhost, sodass ich es einfach auf meinem lokalen Server testen kann.

Projekt einrichten

Jetzt können wir zu unserem Beispielprojekt übergehen. Wir werden eine Login-Seite haben, auf der der Benutzer seinen Benutzernamen und sein Passwort eingibt. Darüber hinaus muss er auch das reCaptcha lösen und das Formular absenden. Sobald das Formular abgesendet wurde, werden Benutzername und Passwort in unserer Anwendung validiert, während wir die Captcha-Antwort mit dem Secret Key an den Google reCaptcha-Server senden und die Antwort erhalten. Die Antwort von Google reCaptcha ist ein JSON mit einem booleschen Erfolgsfeld. Wenn die Validierung erfolgreich ist, ist der Wert true, andernfalls false. Ich werde die Java JSON Processing API verwenden, um die JSON-Antwort zu parsen. Das folgende Bild zeigt unser fertiges Projekt in Eclipse.

Maven-Abhängigkeit hinzufügen

Um das Projektskelett zu erstellen, erstellen Sie einfach ein „Dynamic Web Project“ in Eclipse und konvertieren es dann in ein Maven-Projekt. Fügen Sie einfach die folgende Abhängigkeit in die Datei pom.xml für die JSON-API ein.

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.0.2</version>
</dependency>

Login-Seite mit Google reCAPTCHA

Unten ist unser HTML-Login-Seitencode.

<!DOCTYPE html> <html> <head> <meta charset=„US-ASCII“> <title>Login Page</title> <script src=„https://www.google.com/recaptcha/api.js“></script> </head> <body> <form action=„LoginServlet“ method=„post“> Username: <input type=„text“ name=„user“> <br> Password: <input type=„password“ name=„pwd“> <br> <div class=„g-recaptcha“ datasitekey=„6LdMAgMTAAAAAGYY5PEQeW7b3L3tqACmUcU6alQf“></div> <br> <input type=„submit“ value=„Login“> </form> </body> </html>
<form action=“LoginServlet“ method=“post“>
Username: <input type=“text“ name=“user“> <br> Password:
<input type=“password“ name=“pwd“> <br>
<div class=“g-recaptcha“
data-sitekey=“6LdMAgMTAAAAAGYY5PEQeW7b3L3tqACmUcU6alQf“></div>
<br> <input type=“submit“ value=“Login“>
</form>
</body>
</html>

Login-Erfolgsseite

<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> Hi Name, Login successful. Login Page

Login Servlet

package com.journaldev.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.journaldev.utils.VerifyRecaptcha;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet(description = "Login Servlet", urlPatterns = { "/LoginServlet" }, initParams = {
		@WebInitParam(name = "user", value = "Name"),
		@WebInitParam(name = "password", value = "journaldev") })
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = -6506682026701304964L;

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// get request parameters for userID and password
		String user = request.getParameter("user");
		String pwd = request.getParameter("pwd");
		// get reCAPTCHA request param
		String gRecaptchaResponse = request
				.getParameter("g-recaptcha-response");
		System.out.println(gRecaptchaResponse);
		boolean verify = VerifyRecaptcha.verify(gRecaptchaResponse);

		// get servlet config init params
		String userID = getServletConfig().getInitParameter("user");
		String password = getServletConfig().getInitParameter("password");
		// logging example
		System.out.println("User=" + user + "::password=" + pwd + "::Captcha Verify"+verify);

		if (userID.equals(user) && password.equals(pwd) && verify) {
			response.sendRedirect("LoginSuccess.jsp");
		} else {
			RequestDispatcher rd = getServletContext().getRequestDispatcher(
					"/login.html");
			PrintWriter out = response.getWriter();
			if (verify) {
				out.println("<font color=red>Either user name or password is wrong.</font>");
			} else {
				out.println("<font color=red>You missed the Captcha.</font>");
			}
			rd.include(request, response);
		}
	}
}

VerifyRecaptcha Utility Class

package com.journaldev.utils;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.URL;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.net.ssl.HttpsURLConnection;

public class VerifyRecaptcha {

	public static final String url = "https://www.google.com/recaptcha/api/siteverify";
	public static final String secret = "6LdMAgMTAAAAAJOAqKgjWe9DUujd2iyTmzjXilM7";
	private final static String USER_AGENT = "Mozilla/5.0";

	public static boolean verify(String gRecaptchaResponse) throws IOException {
		if (gRecaptchaResponse == null || "".equals(gRecaptchaResponse)) {
			return false;
		}
		
		try{
		URL obj = new URL(url);
		HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

		// add reuqest header
		con.setRequestMethod("POST");
		con.setRequestProperty("User-Agent", USER_AGENT);
		con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

		String postParams = "secret=" + secret + "&response="
				+ gRecaptchaResponse;

		// Send post request
		con.setDoOutput(true);
		DataOutputStream wr = new DataOutputStream(con.getOutputStream());
		wr.writeBytes(postParams);
		wr.flush();
		wr.close();

		int responseCode = con.getResponseCode();
		System.out.println("\nSending 'POST' request to URL : " + url);
		System.out.println("Post parameters : " + postParams);
		System.out.println("Response Code : " + responseCode);

		BufferedReader in = new BufferedReader(new InputStreamReader(
				con.getInputStream()));
		String inputLine;
		StringBuffer response = new StringBuffer();

		while ((inputLine = in.readLine()) != null) {
			response.append(inputLine);
		}
		in.close();

		// print result
		System.out.println(response.toString());
		
		//parse JSON response and return 'success' value
		JsonReader jsonReader = Json.createReader(new StringReader(response.toString()));
		JsonObject jsonObject = jsonReader.readObject();
		jsonReader.close();
		
		return jsonObject.getBoolean("success");
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
	}
}

Fazit

Das war’s! Ihre Anwendung ist jetzt bereit! Das Google reCAPTCHA Java Web App Projekt ist hier verlinkt zum weiteren experimentieren!

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: