Tutorials  /  Security

Google reCAPTCHA in Java Webanwendung integrieren | Sicher anmelden

Ccentron Redaktion · Januar 2025 ·4 Min. Lesezeit ·Security, Tutorial

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.

Google reCAPTCHA keys
SEC

Passende Infrastruktur bei centron

Absicherung endet nicht beim Server: Cloud Firewalls filtern den Datenverkehr vor der VM – zentral verwaltet, ohne Aufpreis je Regel. Cloud Firewalls ansehen →

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.

Google reCAPTCHA Java Web Application

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.

Code
<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" data-sitekey="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
></div>
<br> <input type="submit" value="Login">
</form>
</body>
</html>
Code

Login-Erfolgsseite

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

Login Servlet

Go
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

Go
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!

Jetzt 200 € Guthaben sichern

Testen Sie Ihr Setup auf ccloud³

Registrieren Sie sich in der ccloud³ und erhalten Sie 200 € Startguthaben für Ihr Projekt – z. B. für eine PostgreSQL-VM mit automatischen Backups.

centron Redaktion Technische Redaktion

Das Redaktionsteam von centron schreibt Anleitungen aus dem Betriebsalltag: getestet auf unserer eigenen Plattform, betrieben im Rechenzentrum in Hallstadt bei Bamberg.

Kategorie Security
Teilen
Noch offene Fragen?

Our team will help you with your specific setup - in German or English, by people who run the platform themselves.

War dieses Tutorial hilfreich?

Your answer is stored anonymously and helps us improve our tutorials.

Kommentare

No comments yet - be the first to ask a question about this tutorial.

Sign in to comment

Comments are open to centron customers. Sign in to your account to ask a question about this tutorial.

Weiterlesen

Das könnte Sie auch interessieren

Jetzt kostenlos anfangen

Melden Sie sich an und erhalten Sie in den ersten 60 Tagen ein Guthaben von 200 € bei centron.

Dieses Werbeangebot gilt nur für neue Konten. Angebot ausschließlich für Gewerbetreibende.

Jetzt loslegen Sales kontaktieren