Machen Sie "Ich bin kein Roboter" in Java EE (Jakarta EE)

0. Umwelt

Die Umgebung, in der dieser Artikel geschrieben wurde

OS...Windows 10 IDE...Eclipse 2020-3 Java...Open JDK 14 Servlet-Container ... Apache Tomcat 9.0.33

1. Erstellen Sie reCAPTCHA

Greifen Sie zunächst auf die reCAPTCHA-Site zu. reCAPTCHA

Erstellen Sie mit der Schaltfläche +.

Geben Sie die Informationen Ihrer Site ein.

SS1.png

Geben Sie einen beschreibenden Namen für das Etikett ein.

Für den Typ reCAPTCHA möchte ich "Ich bin kein Roboter" ausführen, daher habe ich mich für reCAPTCHA v2 entschieden. Dann wird das Kontrollkästchen "Ich bin kein Roboter" angezeigt. Stellen Sie daher sicher, dass es aktiviert ist.

Geben Sie für die Domäne die Domäne ein, für die "Ich bin kein Roboter" festgelegt ist. Wenn Sie die Top-Domain registrieren, können Sie sie in Subdomains verwenden. Wenn Sie es in der Entwicklungsumgebung verwenden möchten, registrieren Sie auch "localhost".

Der Besitzer ... nun, Sie können tun, was Sie wollen.

Akzeptieren Sie abschließend die reCAPTCHA-Nutzungsbedingungen, wählen Sie aus, ob die Warnung an den Eigentümer gesendet werden soll, und klicken Sie auf Senden

Auf dem nächsten Bildschirm werden zwei Zeichenfolgen angezeigt. Notieren Sie sich daher beide.

2. Erstellen Sie ein neues Projekt in Eclipse

Stellen Sie diesmal "RecaptchaTest" ein. (Wenn Sie es bereits gemacht haben, verwenden Sie es.)

3. HTML-Erstellung

Erstellen wir eine neue HTML-Datei im WebContent des in Eclipse erstellten Projekts.

Oder Sie können es mit einem externen Editor erstellen und in Ihr Projekt einfügen.

Normalerweise schreibe ich keinen solchen verdammten Code, aber diesmal ist es ein Beispiel. .. ..

<!doctype html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<title>Probe von reCAPTCHA</title>
		<script src="https://www.google.com/recaptcha/api.js" async defer></script>
	</head>
	<body>
		<form action="login" method="post">
			ID:<input type="text" name="id"><br>
Passwort:<input type="password" name="current-password">
			<div class="g-recaptcha" data-sitekey="[Geben Sie die Zeichenfolge in das Feld über den beiden zuvor angezeigten Zeichenfolgen ein.]"></div>
			<input type="submit" value="Einloggen">
		</form>
	</body>
</html>

Das Wichtigste ist, das Skript des Kopfes und in der Form zu lesen

<div class="g-recaptcha" data-sitekey="[Diejenige, die in das Feld oben geschrieben wurde, das zuvor angezeigt wurde]">

Stellen.

Der Typ "Ich bin kein Roboter" wird angezeigt, wo Sie diesen Div platzieren.

Nachdem Sie den obigen HTML-Code ausgefüllt haben, versuchen wir, ihn auf dem Server auszuführen. Wenn es wie auf dem Bild unten aussieht, ist es okay! !!

SS3.PNG

4. Klassenerstellung

Erstellen wir eine Klasse (ein Modell), die Googles reCAPTCHA nach Ergebnissen abfragt.

Der Mechanismus ist einfach: Geben Sie die angegebenen Parameter in die festgelegte URL POST ein, und der JSON wird in der Antwort zurückgegeben.

Lassen Sie uns SECRET_KEY im folgenden Code in die Zeichenfolge ändern, die wir ~~~ erhalten haben

package com.sakurai_shinya.recaptcha;

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

import javax.net.ssl.HttpsURLConnection;

public class RecaptchaAuthenticator {

	private static final String URL = "https://www.google.com/recaptcha/api/siteverify";
	private static final String SECRET_KEY = "[Die Zeichenfolge, die sich im Feld unten befand]";

	public static boolean checkRecaptcha(String userToken) throws IOException {
		String recaptchaResponse = post(new URL(URL), "secret=" + SECRET_KEY + "&response=" + userToken);
		return recaptchaResponse.contains("\"success\": true,");
	}

	private static String post(URL url, String parameters) throws IOException {
		HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
		con.setDoOutput(true);
		try (DataOutputStream dos = new DataOutputStream(con.getOutputStream())) {
			dos.writeBytes(parameters);
			dos.flush();
		}
		if (con.getResponseCode() != 200) {
			throw new IOException("Bei der Kommunikation mit dem Server ist ein Fehler aufgetreten.");
		}
		StringBuilder sb = new StringBuilder();
		try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
			String tempStr;
			while ((tempStr = in.readLine()) != null) {
				sb.append(tempStr);
			}
		}
		return sb.toString();
	}
}

Da es problematisch ist, habe ich die Antwort wie folgt erstellt: OK, wenn "" Erfolg ": true," enthalten ist, und NG, wenn es nicht enthalten ist. Wenn Sie es richtig machen, sollten Sie ein Objekt richtig machen und es analysieren.

5. Controller erstellen (Servlet)

Ich werde den gesamten Servlet-Code darauf setzen, aber nur bei POST. Oder besser gesagt, schauen Sie sich einfach POST an

package com.sakurai_shinya.servlet;

import java.io.IOException;

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

import com.sakurai_shinya.recaptcha.RecaptchaAuthenticator;

@WebServlet("/login")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html");
		super.service(request, response);
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.sendRedirect("login.html");
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
		boolean recaptchaResult = false;
		try {
			recaptchaResult = RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));
		} catch (IOException e) {
			response.getWriter().append("Bei der Kommunikation mit dem reCAPTCHA-Authentifizierungsserver ist ein Fehler aufgetreten." + e.toString());
		}
		if (recaptchaResult) {//reCAPTCHA Erfolg
			//Der Vorgang des Abgleichs der ID und des Passworts hier.
			String inputId = request.getParameter("id");
			String inputPass = request.getParameter("current-password");
			response.getWriter().append("Erfolgreiche reCAPTCHA-Zertifizierung.<br>ID:" + inputId + "<br>Passwort:" + inputPass);
		} else {//reCAPTCHA-Fehler
			response.getWriter().append("Die ReCAPTCHA-Authentifizierung ist fehlgeschlagen.");
		}
	}
}
RecaptchaAuthenticator.checkRecaptcha(request.getParameter("g-recaptcha-response"));

Wenn Sie checkRecaptcha der zuvor erstellten Klasse aufrufen, ist das Ergebnis wahr oder falsch, oder es wird eine Ausnahme zurückgegeben. Wenn true, ist reCAPTCHA erfolgreich. Wenn false, schlägt reCAPTCHA fehl und die Ausnahme ist ein Fehler.

Übrigens, wenn Sie den G-Recaptcha-Typen in das Formular einfügen, werden die als G-Recaptcha-Antwort bezeichneten Parameter zusammen mit einer mysteriösen Kraft veröffentlicht. Sie senden dies an den Server von Google, um den Nutzer zu identifizieren ~~~

6. Testen

Probieren wir es aus! result1.PNG

Testen Sie mit und ohne diesen Check! result2.PNG

result3.PNG

7. Bonus

7-1. Wie man es schwarz macht

Wenn Sie dem Typ, der g-recaptcha hat, data-theme = dark hinzufügen, wird es schwarz. Jetzt können Sie es auch auf einer schwarzen Seite kühl platzieren! !!

<div class="g-recaptcha" data-sitekey="6Lfx-eMUAAAAALrP774ZrvQa_AtguQhusF0M2W6s" data-theme="dark"></div>

So ↓

SS4.PNG

7-2. Wie man es ins Englische macht

Wenn Sie dem GET-Parameter von api.js hl = en hinzufügen, erfolgt dies in englischer Sprache.

<script src="https://www.google.com/recaptcha/api.js?hl=en" async defer></script>

SS5.PNG

Im Gegensatz zu Japanisch vermittelt es einen stilvollen Eindruck, der an seltsamen Positionen Linien bricht.

Andere Sprachen stehen übrigens im Handbuch von reCAPTCHA. Language Codes  |  reCAPTCHA  |  Google Developers

Recommended Posts

Machen Sie "Ich bin kein Roboter" in Java EE (Jakarta EE)
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Machen Sie einen Blackjack mit Java
[Persönliches Memo] Erstellen Sie eine einfache, tiefe Kopie mit Java
Lass uns einen Roboter bauen! "Eine einfache Demo von Java AWT Robot"
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Refactoring: Machen Sie Blackjack in Java
Suchen Sie eine Teilmenge in Java
[Java] Mach es konstant
Machen Sie einen Diamanten mit Java
Erstellen wir eine Taschenrechner-App mit Java ~ Zeigen Sie das Anwendungsfenster an
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Ich habe einen RESAS-API-Client in Java erstellt
3 Implementieren Sie einen einfachen Interpreter in Java
Ich habe ein PDF mit Java erstellt.
So erstellen Sie einen Java-Container
[Java] Verwenden Sie nicht "+" im Anhang!
Ein einfaches Beispiel für Rückrufe in Java
Ich bin mir bei Java Servlet nicht sicher
Java Calendar ist kein Singleton.
Machen Sie einen SOAP-Aufruf in C #
Bleiben Sie in einem Java Primer stecken
Java EE 8 (Jakarta EE 8) Zusammenfassung der neuen Funktionen
So erstellen Sie ein Java-Array
[JAVA] Projekt Euler, ich steckte im achten Quartal fest
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Was ist eine Klasse in der Java-Sprache (3 /?)
So erstellen Sie eine Java-Kalenderzusammenfassung
Bei der Suche nach mehreren in einem Java-Array
Einfach, Slack Bot mit Java zu machen
[Erstellen] Ein Memorandum über das Codieren in Java
Java erstellt eine Tabelle in einem Word-Dokument
Java erstellt ein Kreisdiagramm in Excel
Was ist eine Klasse in der Java-Sprache (1 /?)
Wie erstelle ich einen Discord Bot (Java)
Was ist eine Klasse in der Java-Sprache (2 /?)
Erstellen Sie eine TODO-App in Java 7 Create Header
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Implementieren Sie so etwas wie einen Stack in Java
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Erstellen einer Matrixklasse in Java Teil 1
[Java] Erstellen wir eine DB-Zugriffsbibliothek!
Deklarieren Sie keine Variablen in List in Java
Erstellen wir eine Taschenrechner-App mit Java ~ Erstellen Sie einen Anzeigebereich im Fenster
Ursache ist nicht sichtbar, wenn Methoden anderer Klassen in Java aufgerufen werden
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Eine Geschichte über das JDK in der Java 11-Ära
So zeigen Sie eine Webseite in Java an
[Android / Java] Betreiben Sie eine lokale Datenbank in Room
Messen Sie die Größe eines Ordners mit Java
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Lösung für NetBeans 8.2 funktioniert nicht in Java 9-Umgebung
Ein Hinweis, wenn Sie Tupel in Java möchten