Рубрики
Без рубрики

Как интегрировать Google reCAPTCHA в веб-приложение Java

Мне никогда не нравились капчи, потому что на конечном пользователе всегда лежало бремя понимания букв и доказательства того, что он человек, а не программный бот. Но когда я

Автор оригинала: Pankaj Kumar.

Мне никогда не нравились капчи, потому что на конечном пользователе всегда лежало бремя понимания букв и доказательства того, что он человек, а не программный бот. Но когда я недавно увидел новую Google reCAPTCHA на веб-сайте, она мне сразу понравилась.

Потому что все, что нам нужно, это установить флажок, и он определит, человек вы или робот. Google называет это Без использования CAPTCHA reCAPTCHA и использует продвинутый механизм анализа рисков и адаптивные CAPTCHA, чтобы автоматизированное программное обеспечение не совершало оскорбительных действий на вашем сайте.

Таким образом, это легло в основу этого поста, в котором я покажу вам, как использовать Google reCAPTCHA в вашем веб-приложении на основе Java.

Прежде чем мы продолжим наш проект, первое, что вам нужно сделать, это зайти в Google reCAPTCHA и зарегистрироваться. После этого вы получите Ключ сайта , который используется для отображения виджета reCAPTCHA на ваших веб-страницах. Вы также получите Секретный ключ , который следует хранить в секрете и использовать при общении с сервером Google для проверки ответа на капчу.

После того, как я зарегистрировал тестовый сайт, я получил ключи ниже и буду использовать их в своем проекте. Обратите внимание, что при регистрации вам также необходимо указать доменное имя, и ключи будут работать только на этом доменном имени. Кроме того, ключи всегда будут работать на локальном хосте, поэтому я могу легко протестировать их на своем локальном сервере.

Теперь мы можем перейти к нашему примеру проекта. У нас будет страница входа в систему, где пользователь введет имя пользователя и пароль, кроме того, ему также нужно будет решить рекапчу и отправить форму.

Как только форма будет отправлена, имя пользователя и пароль будут проверены в нашем приложении, в то время как мы отправим ответ captcha с секретным ключом на сервер Google reCAPTCHA и получим ответ.

Ответ от Google reCAPTCHA-это JSON с логическим полем успеха, если значение успеха будет истинным, в противном случае оно будет ложным. Я буду использовать API обработки Java JSON для анализа ответа JSON.

На рисунке ниже показан наш окончательный проект в Eclipse.

Чтобы получить скелет проекта, просто создайте “Динамический веб-проект” в Eclipse, а затем преобразуйте его в проект Maven. Просто добавьте нижеприведенную зависимость в pom.xml файл для JSON API.


	org.glassfish
	javax.json
	1.0.2

Давайте рассмотрим каждый из компонентов по очереди.

Просмотр страницы с помощью Google reCAPTCHA

Ниже приведен код нашей html – страницы входа в систему.

Ниже приведен код нашей html – страницы входа в систему.






Login Page




	
Username:
Password:

Нам нужно добавить JS-файл Google reCAPTCHA в раздел HTML head, а затем добавить в нашу форму, чтобы получить виджет reCAPTCHA. Это все на стороне клиента, это действительно так просто!

Как только пользователь будет подтвержден, он будет отправлен на страницу успеха ниже.

Как только пользователь будет подтвержден, он будет отправлен на страницу успеха ниже.

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>





Login Success Page


Hi Pankaj, Login successful.

Login Page

Сервлет входа в систему

Ниже приведен наш простой LoginServlet.java код сервлета, в котором мы проверяем поля имени пользователя и пароля. Для простоты они встроены как WebInitParam в сам код сервлета. Обратите внимание, что для использования этих аннотаций вам необходимо использовать сервлет 3, поэтому вам необходимо использовать Tomcat-7 или более поздние версии, поддерживающие спецификацию сервлета 3.

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 = "Pankaj"),
		@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("Either user name or password is wrong.");
			} else {
				out.println("You missed the Captcha.");
			}
			rd.include(request, response);
		}
	}
}

Как только форма с капчей отправлена, мы получаем параметр запроса “g-recaptcha-ответ”, который требуется отправить для проверки. Последняя часть-это служебный класс для отправки запроса POST для проверки, анализа ответа JSON и соответствующего возврата.

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;
		}
	}
}

Это все. Наше приложение готово, ниже приведены страницы ответов, которые мы получаем на основе пользовательских данных.

Страница входа в систему с виджетом Google Recaptcha

Google Recaptcha Проверена на стороне клиента

Страница ответа после проверки Google Recaptcha на стороне сервера

Ответ, в котором Рекапча не была решена

Рекапча решена, но пользователь/пароль не совпали

Вы можете скачать проект по ссылке ниже и поиграть с ним, чтобы узнать больше.