Utiliser Google reCAPTCHA dans l'application Web Java
1. Qu'est-ce que reCAPTCHA?
CAPTCHA est un outil de validation sur le site Web pour vous assurer que votre site n'est pas SPAM par un outil automatique. Traditionnellement, captcha est une image avec des lignes de texte qu'un programme automatisé est difficile à analyser, les utilisateurs doivent retaper le texte similaire au texte sur l'image pour prouver qu'ils ne sont pas un robot. Le CAPTCHA traditionnel peut répondre aux exigences énoncées, cependant, il est parfois très ennuyeux, l'inscription CAPTCHA est parfois difficile à lire par les utilisateurs.
L'image d'un CAPTCHA traditionnel:
reCAPTCHA est un service CAPTCHA gratuit qui aide à protéger votre site contre le SPAM, les enregistrements malveillants et d'autres formes d'attaques où les ordinateurs tentent de se déguiser en tant qu'humain. reCAPTCHA se présente sous la forme d'un widget que vous pouvez facilement ajouter à votre blog, forum, inscription, etc.
L'illustration ci- dessous décrit le principe de fonctionnement de reCAPTCHA:
- Sur la forme des données d'entrée Google reCAPTCHA.
- Lorsque l'utilisateur cliquez à "I'm not a robot", une requête Ajax sera automatiquement envoyée au service Google reCAPTCHA et recevra un code d'authentification et sera hébergé sur un champ caché (g-recaptcha-response). Tout ce que les utilisateurs doivent faire est de vérifier le bouton "I'm not a robot" au lieu d'avoir à lire une inscription illisible qui est créée par le CAPTCHA traditionnel.
- Après avoir entré les informations sur le formulaire et vérifiez le bouton "I'm not a robot", l'utilisateur clique sur le bouton Soumettre le formulaire. Sur le serveur, le programme créera une demande contenant le code d'authentification dans l'étape précédente, enverra au service Google reCAPTCHA pour vérifier le code. Le service Google reCAPTCHA renverra les résultats vérifiés.
3. S'inscrire Google reCAPTCHA
D'abord, vous devez vous inscrire à Google reCAPTCHA
Après une inscription réussie, vous avez le Site-Key & Secret-Key
- Site Key: 6LelZAsTAAAAAAv1ADYDnq8AzbmPmbMvjh-xhfgB
- Secret Key: 6LelZAsTAAAAAKa_s6g2yuJzByYlk0FH_6iTkZJC
4. Créer rapidement l'exemple du projet
- File/New/Other..
Saisissez:
- Group Id: org.o7planning
- Artifact Id: reCaptchaDemo
- package: org.o7planning.tutorial.recaptcha
Le projet est créé.
Maven a créé webapp project qui peut manquer quelques composants, vous devez le réparer.
La configuration web.xml utilise WebApp 3.0 au lieu d'utiliser WebApp 2.3 qui est généré automatiquement par Maven.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
</web-app>
La configuration Maven:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.o7planning</groupId>
<artifactId>reCaptchaDemo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>reCaptchaDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Servlet Library -->
<!-- http://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- JSON Library -->
<!-- http://mvnrepository.com/artifact/org.glassfish/javax.json -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies>
<build>
<finalName>reCaptchaDemo</finalName>
<plugins>
<!-- Config: Maven Tomcat Plugin -->
<!-- http://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!-- Config: contextPath and Port (Default - /reCaptchaDemo : 8080) -->
<!--
<configuration>
<path>/</path>
<port>8899</port>
</configuration>
-->
</plugin>
</plugins>
</build>
</project>
Maintenant, votre projet n'a plus d'erreur.
5. Code Project
C'est une image après l'achèvement du projet
MyConstants.java
package org.o7planning.tutorial.recaptcha;
public class MyConstants {
public static final String SITE_KEY ="6LelZAsTAAAAAAv1ADYDnq8AzbmPmbMvjh-xhfgB";
public static final String SECRET_KEY ="6LelZAsTAAAAAKa_s6g2yuJzByYlk0FH_6iTkZJC";
}
VerifyUtils.java
package org.o7planning.tutorial.recaptcha;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.net.ssl.HttpsURLConnection;
public class VerifyUtils {
public static final String SITE_VERIFY_URL = //
"https://www.google.com/recaptcha/api/siteverify";
public static boolean verify(String gRecaptchaResponse) {
if (gRecaptchaResponse == null || gRecaptchaResponse.length() == 0) {
return false;
}
try {
URL verifyUrl = new URL(SITE_VERIFY_URL);
// Ouvrez une connexion (Connection) à l'URL ci-dessus.
HttpsURLConnection conn = (HttpsURLConnection) verifyUrl.openConnection();
// Ajoutez les informations d'en-tête à la demande pour préparer l'envoi au serveur.
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
// Les données seront envoyées au serveur.
String postParams = "secret=" + MyConstants.SECRET_KEY //
+ "&response=" + gRecaptchaResponse;
// Send Request
conn.setDoOutput(true);
// Obtenez Output Stream (le flux de sortie) de la connexion au Server.
// Écrivez des données dans ce flux, ce qui signifie envoyer des données au serveur.
OutputStream outStream = conn.getOutputStream();
outStream.write(postParams.getBytes());
outStream.flush();
outStream.close();
// Le code de réponse renvoie au Server.
int responseCode = conn.getResponseCode();
System.out.println("responseCode=" + responseCode);
// Obtenez Input Stream (Le flux de l'entrée) de la Connexion
// pour lire des données envoyées par Server.
InputStream is = conn.getInputStream();
JsonReader jsonReader = Json.createReader(is);
JsonObject jsonObject = jsonReader.readObject();
jsonReader.close();
// ==> {"success": true}
System.out.println("Response: " + jsonObject);
boolean success = jsonObject.getBoolean("success");
return success;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
LoginServlet.java
package org.o7planning.tutorial.recaptcha.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 958900029856081978L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
RequestDispatcher dispatcher =
req.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
DoLoginServlet.java
package org.o7planning.tutorial.recaptcha.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 org.o7planning.tutorial.recaptcha.VerifyUtils;
@WebServlet(urlPatterns = "/doLogin")
public class DoLoginServlet extends HttpServlet {
private static final long serialVersionUID = 958900029856081978L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userName = request.getParameter("userName");
String password = request.getParameter("password");
boolean valid = true;
String errorString = null;
// Check userName & password
if (!"tom".equals(userName) || !"tom001".equals(password)) {
valid = false;
errorString = "UserName or Password invalid!";
}
if (valid) {
String gRecaptchaResponse = request.getParameter("g-recaptcha-response");
System.out.println("gRecaptchaResponse=" + gRecaptchaResponse);
// Verify CAPTCHA.
valid = VerifyUtils.verify(gRecaptchaResponse);
if (!valid) {
errorString = "Captcha invalid!";
}
}
if (!valid) {
request.setAttribute("errorString", errorString);
RequestDispatcher dispatcher = //
request.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");
dispatcher.forward(request, response);
return;
} else {
request.getSession().setAttribute("loginedUser", userName);
// Redirect to /userInfo
response.sendRedirect(request.getContextPath()+"/userInfo");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
UserInfoServlet.java
package org.o7planning.tutorial.recaptcha.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/userInfo")
public class UserInfoServlet extends HttpServlet {
private static final long serialVersionUID = 958900029856081978L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) //
throws ServletException, IOException {
if (req.getSession().getAttribute("loginedUser") == null) {
resp.sendRedirect(req.getContextPath() + "/login");
return;
}
RequestDispatcher dispatcher //
= req.getServletContext().getRequestDispatcher("/WEB-INF/views/userInfoView.jsp");
dispatcher.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) //
throws ServletException, IOException {
this.doGet(req, resp);
}
}
Pour utiliser reCAPTCHA sur la page JSP, vous devez déclarer la bibliothèque javascript. Notez que reCAPTCHA fournit 40 langues d'utilisateur. Vous pouvez configurer la langue affichée sur reCAPTCHA ou le laisser par défaut, au cas où, vous le laissez par défaut, reCAPTCHA affichera la langue suite à la localisation géographique de l'utilisateur (Basée sur l'adresse IP).
<!-- reCAPTCHA with English language -->
<script src='https://www.google.com/recaptcha/api.js?hl=en'></script>
<!-- reCAPTCHA with Vietnamese language -->
<script src='https://www.google.com/recaptcha/api.js?hl=vi'></script>
<!-- reCAPTCHA with Auto language -->
<script src='https://www.google.com/recaptcha/api.js'></script>
/WEB-INF/views/loginView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
<!-- reCAPTCHA Libary -->
<script src='https://www.google.com/recaptcha/api.js?hl=en'></script>
</head>
<body>
<h3>Login:</h3>
<p style="color:red;">${errorString}</p>
<form name="loginForm" method="POST" action="doLogin">
<table border="0">
<tr>
<td>User Name</td>
<td><input type="text" name="userName" /></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" /></td>
</tr>
</table>
<!-- reCAPTCHA -->
<div class="g-recaptcha"
data-sitekey="6LelZAsTAAAAAAv1ADYDnq8AzbmPmbMvjh-xhfgB"></div>
<input type="submit" value="Submit" />
</form>
<p style="color:blue;">User Name: tom, Password: tom001</p>
</body>
</html>
/WEB-INF/views/userInfoView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>User Info</title>
</head>
<body>
Hello ${loginedUser}
</body>
</html>
Tutoriels de programmation Java Servlet/JSP
- Installer Tomcat Server pour Eclipse
- Installer Glassfish Web Server sur Windows
- Exécutez l'application Web Java Maven dans Tomcat Maven Plugin
- Exécutez l'application Web Java Maven dans Jetty Maven Plugin
- Exécuter une tâche d'arrière-plan dans l'application Java Servlet
- Le Tutoriel de Java Servlet pour des débutants
- Le Tutoriel de Java Servlet Filter
- Le Tutoriel de Java JSP
- Le Tutoriel de Java JSP Standard Tag Library (JSTL)
- Installer Web Tools Platform pour Eclipse
- Créez une application de connexion simple et sécurisez les pages avec Java Servlet Filter
- Créer une application Web Java simple à l'aide de Servlet, JSP et JDBC
- Upload et Download de fichiers stockés sur le disque dur avec Java Servlet
- Télécharger et télécharger des fichiers à partir de la base de données à l'aide de Java Servlet
- Affichage une image dans une base de données avec Java Servlet
- Redirection 301, redirection permanente dans Java Servlet
- Comment redirige http en https automatiquement dans une application web de Java?
- Utiliser Google reCAPTCHA dans l'application Web Java
Show More