الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إضافة Captcha إلى صفحة JSP

بدأه herch في 28 يناير 2010 · 1 رد · 1,057 مشاهدة · في JavaEE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم،

لمن لا يعلم ما هي ال Captcha، فهي صورة تحتوي على حروف و أرقام، ويجب على المستخدم كتابة هاته الحروف، والغرض من هذا هو التأكد من أن المستخدم هو إنسان، وليس robot.

عادة الصورة تكون ملتوية وفيها بعض التشويش حتى تصعب قرائتها، لكن في المثال سنقوم بعمل captcha بسيطة تكتب فقط حروفا بدون أي تشويش.

سنقوم بكتابة servlet تكون هي المسؤولة عن إنشاء الصورة. سنكتب الكود طبعا داخل doGet().

أولا نحدد أن ما ستعيده ال servlet هو صورة من نوع gif

response.setContentType("img/gif");

ثم نعرف متغيرين يمثلان طول وعرض الصورة

int width = 100, height = 30;

ننشئ الصورة، وهي كائن من فئة BufferedImage

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

بعد ذلك نعرف مصفوفة char ستحتوي على الكود ascii الخاص بالحروف lower case، والتي تبتدأ من 97 وتنتهي في 122.

char[] letters = new char[25];
for (int i = 0, ascii = 97; i < 25; i++, ascii++) {
	letters = (char)ascii;
}

وننشئ String يتكون من ست حروف، كل حرف سنأخذه عشوائيا من المصفوفة char التي عرفنا سابقا

Random rd = new Random();
StringBuilder strB = new StringBuilder();
for (int i = 0; i < 6; i++) {
	strB.append(letters[rd.nextInt(25)]);
}
String code = strB.toString();

ثم نرسم ال String الذي حصلنا عليه، من أجل ذلك نقوم باسترجاع الكائن Graphics2D المرتبط بالصورة، نلون الخلفية باللون الرمادي، نكبر حجم الخط ونكتب الكلمة في الصورة

Graphics2D g2 = image.createGraphics();
g2.setColor(Color.LIGHT_GRAY);
g2.fillRect(0, 0, width, height);
g2.setColor(Color.RED);
g2.setFont(g2.getFont().deriveFont(18f));
g2.drawString(code, 10, 20);

وفي الأخير نضيف الكلمة الذي كتبناه في الصورة إلى الSession، حتى نتمكن من المقارنة بينها وبين ما بكتبه المستخدم

request.getSession().setAttribute("captchaCode", code);

ونرسل النتيجة

OutputStream out = response.getOutputStream();
ImageIO.write(image, "gif", out);
out.close();

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CreateCaptcha extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

 	response.setContentType("img/gif");
		int width = 100, height = 30;
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
		char[] letters = new char[25];
		for (int i = 0, ascii = 97; i < 25; i++, ascii++) {
			letters = (char)ascii;
		}
		Random rd = new Random();
		StringBuilder strB = new StringBuilder();
		for (int i = 0; i < 6; i++) {
			strB.append(letters[rd.nextInt(25)]);
		}
		String code = strB.toString();
		Graphics2D g2 = image.createGraphics();
		g2.setColor(Color.LIGHT_GRAY);
		g2.fillRect(0, 0, width, height);
		g2.setColor(Color.RED);
		g2.setFont(g2.getFont().deriveFont(18f));
		g2.drawString(code, 10, 20);
		request.getSession().setAttribute("captchaCode", code);
		OutputStream out = response.getOutputStream();
		ImageIO.write(image, "gif", out);
		out.close();
	} 
}

الآن سنكتب الصفحة JSP التي ستنادي على ال servlet وتظهر ال captcha

لتوليد ال captcha، سننادي على ال servlet ونضع النتيجة داخل الوسم <img> مع تحدبد المعطى src، ونضيف أيضا text input وزر submit

<img src="/WebApplication1/CreateCaptcha"/><br/><input type="text" name="captchaInput"/><input type="submit" value="OK"/>

مع تغيير WebApplication1 إلى إسم المشروع الذي أنشأتموه.

ثم نقوم بالتحقق من ما كتب المستخدم، ونقارنه بالقيمة الموجودة في ال session

<%
	if (request.getParameter("captchaInput") != null) {
		if (request.getParameter("captchaInput").equals(session.getAttribute("captchaCode"))) {
			out.print("The code is correct :)");
		} else {
			out.print("The code is incorrect");
		}
	}
%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
 "http://www.w3.org/TR/html4/loose.dtd">

<html>
	<head>
 	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 	<title>Captcha test</title>
	</head>
	<body>
 	<h1>To be, or not to be... a human. This is the question ;)</h1>
		<form>
			<img src="/WebApplication1/CreateCaptcha"/><input type="text" name="captchaInput"/><input type="submit" value="OK"/>
			<%
				if (request.getParameter("captchaInput") != null) {
					if (request.getParameter("captchaInput").equals(session.getAttribute("captchaCode"))) {
						out.print("The code is correct :)");
					} else {
						out.print("The code is incorrect");
					}
				}
			%>
		</form>
	</body>
</html>

والنتيجة تكون على الشكل التالي

post-181903-12646819875524_thumb.png

تم تعديل هذه المشاركة بواسطة herch في 28 يناير 2010 في 15:33

#2

السلام عليكم ورحمة الله وبركاته

اخوتي الاعزاء وهذه فكرة اخرى الى Captcha

style.css

* { font-size: 12px; font-family: Verdana }

input, textarea { border: 1px solid #ccc }

tr { margin: 5px; padding:5px;}

.alert { font-size:15px; color:red; font-weight:bolder }

index.jsp

<%-- 
    Document   : index1
    Created on : Jan 6, 2010, 11:13:38 AM
    Author     : Mahmood2010
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Captcha</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<center>
<form method="post">
<table cellspacing="15">
<tr>
<td>Name</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>Message</td>
<td> <textarea type="text" cols="25" rows="8" name="message"></textarea></td>
</tr>

<tr>
<td>Are you human?</td>
<td><input type="text" name="code"></td>
</tr>

</table>

<br>
<img src="http://localhost:8084/ConnToMysql/CaptchaServlet">

<br><br>
<input type="submit" value="submit">

</form>
<br><br>
<%
  String captcha = (String) session.getAttribute("captcha");
  String code = (String) request.getParameter("code");

  if (captcha != null && code != null) {

    if (captcha.equals(code)) {
	  out.print("<p class='alert'>Correct</p>");
    } else {
          out.print("<p class='alert'>Incorrect</p>");
    }
  }
%>
</center>
</body>
</html>

CaptchaServlet.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.zetcode;


import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.*;

import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;


public class CaptchaServlet extends HttpServlet {


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

    int width = 150;
    int height = 50;

    char data[][] = {
        { 'z', 'e', 't', 'c', 'o', 'd', 'e' },
        { 'l', 'h', 'n', 'g', 'x' },
        { 'c', 'r', 'd', 'e', 's', 's', 'd' },
        { 'l', 'f', 'n', 'r', 'e' },
        { 'f', 'i', 'n', 'u', 'd' },
        { 'u', 'd', 'v', '3', 'v', 'u' },
        { 'u', '5', 'u', '6', 't', 'r' },
         { 'f', 'r', '4', 'e', 'b', 's', 'd' },
          { 'r', 'r', '6', 'e', 'f', '4', 'd' },
          { 'e', 'i', 'n', 'f', 'x' },
          { 'l', '4', 'n', '6', '5' },
        { 'u', 'b', 'r', 'n', 't', 'u' },
        { 'u', 'r', 'u', '5', 't', '5' },
        { 'u', '5', 'u', '4', 't', 'e' },
         { 'f', 'r', 'e', 'r', 'r', 's', 'r' },
          { 'f', 'r', 'd', 'e', 'f', 'r', 'd' },
        { 'j', 'e', 'e' }
    };


    BufferedImage bufferedImage = new BufferedImage(width, height,
                  BufferedImage.TYPE_INT_RGB);

    Graphics2D g2d = bufferedImage.createGraphics();

    Font font = new Font("Georgia", Font.BOLD, 18);
    g2d.setFont(font);

    RenderingHints rh = new RenderingHints(
           RenderingHints.KEY_ANTIALIASING,
           RenderingHints.VALUE_ANTIALIAS_ON);

    rh.put(RenderingHints.KEY_RENDERING,
           RenderingHints.VALUE_RENDER_QUALITY);

    g2d.setRenderingHints(rh);

    GradientPaint gp = new GradientPaint(0, 0,
    Color.red, 0, height/2, Color.black, true);

    g2d.setPaint(gp);
    g2d.fillRect(0, 0, width, height);

    g2d.setColor(new Color(255, 153, 0));

    Random r = new Random();
    int index = Math.abs(r.nextInt()) % 5;

    String captcha = String.copyValueOf(data[index]);
    request.getSession().setAttribute("captcha", captcha );

    int x = 0;
    int y = 0;

    for (int i=0; i<data[index].length; i++) {
        x += 10 + (Math.abs(r.nextInt()) % 15);
        y = 20 + Math.abs(r.nextInt()) % 20;
        g2d.drawChars(data[index], i, 1, x, y);
    }

    g2d.dispose();

    response.setContentType("image/png");
    OutputStream os = response.getOutputStream();
    ImageIO.write(bufferedImage, "png", os);
    os.close();
  }


  protected void doGet(HttpServletRequest request,
                       HttpServletResponse response)
                           throws ServletException, IOException {
      processRequest(request, response);
  }


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

وهذه صورة التنفيذ في المرفقات

سلامي

اخوكم

محمود سامي

post-202915-12647086300784_thumb.gif

تم تعديل هذه المشاركة بواسطة mahmoodsami في 28 يناير 2010 في 22:59

مواضيع مشابهة