Genellikle formları bot ve spamlardan korumak amacıyla kullanılan doğrulama kodu için Google'un apisini kullanıyordum. Hem tasarımı olsun hemde hızlı olmasından dolayı. Fakat formları post ettikten sonra ajax ile belirli div alanlarının içini refresh ettirdiğinizde malesef Google apisi kayboluyor. Bunun sebebi google apisinin çalışma mantığı sayfanın refresh edilmesine göre kod üretmesidir. Bunu aşmak için kendi doğrulama kodumu yazmaya karar verdim. Kaynak olarak 7-8 tane kaynak buldum derleyip, ufak bir şey ürettim.
İşe koyulalım.
Yapı olarak, spagetti koddan nefret etmem ve bir düzen aşığı olarak. Var olan web sayfalarının (jsp) içine minimum kod yazmayı esas kabul ediyorum. Bütün işi arka tarafta mutfakta(class'lar içinde) yapıp bize lazım olanı elde edip, sunmak en iyilerinden biri olsa gerek.
Recaptcha Class'ı.
PHP Kod: Kodu kopyalamak için üzerine çift tıklayın!
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/* * To change this template, choose Tools | Templates * and open the template in the editor.
*/
/**
* * [MENTION=21475]AuthoR[/MENTION] turgay
*/
public class MyReCaptcha {
public MyReCaptcha(HttpServletRequest request, HttpServletResponse response) {
String imageFormat = "jpg";
response.setContentType("image/" + imageFormat);
try {
// Imaj Ozellikleri
Color backgroundColor = Color.BLUE;
//Arka Plan rengi
Color borderColor = Color.black;
//Kenarlık Rengi Color textColor = Color.white;
// Yazi rengi
Font textFont = new Font("Arial", Font.PLAIN, paramInt(request, "fontSize", 20));
//Yazi tipi
int charsToPrint = 6;
//Yazi boyutu
int width = paramInt(request, "width", 100);
//imaj genisliği
int height = paramInt(request, "height", 30);
//imaj yüksekliği
float horizMargin = 20.0f;
//yatak bosluk
float imageQuality = 0.95f;
// Imaj kalitesi(Maksimum deger 1.0)
double rotationRange = 0.7;
// Yazılarin ekrandaki durusu (Donus deger aralıgı)
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) bufferedImage.getGraphics(); g.setColor(backgroundColor);
g.fillRect(0, 0, width, height);
g.setColor(textColor);
g.setFont(textFont);
FontMetrics fontMetrics = g.getFontMetrics();
int maxAdvance = fontMetrics.getMaxAdvance();
int fontHeight = fontMetrics.getHeight();
String elegibleChars = "ABCDEFGHJKLMPQRSTUVWXYabcdefhjkmnpqrstuvwxy234567 89";
char[] chars = elegibleChars.toCharArray();
float spaceForLetters = -horizMargin * 2 + width;
float spacePerChar = spaceForLetters / (charsToPrint - 1.0f);
StringBuffer finalString = new StringBuffer();
for (int i = 0; i < charsToPrint; i++) {
double randomValue = Math.random();
int randomIndex = (int) Math.round(randomValue * (chars.length - 1)); char characterToShow = chars[randomIndex];
finalString.append(characterToShow);
int charWidth = fontMetrics.charWidth(characterToShow);
int charDim = Math.max(maxAdvance, fontHeight);
int halfCharDim = (int) (charDim / 2);
BufferedImage charImage = new BufferedImage(charDim, charDim, BufferedImage.TYPE_INT_ARGB);
Graphics2D charGraphics = charImage.createGraphics();
charGraphics.translate(halfCharDim, halfCharDim);
double angle = (Math.random() - 0.5) * rotationRange;
charGraphics.transform(AffineTransform.getRotateIn stance(angle));
charGraphics.translate(-halfCharDim, -halfCharDim);
charGraphics.setColor(textColor); charGraphics.setFont(textFont);
int charX = (int) (0.5 * charDim - 0.5 * charWidth);
charGraphics.drawString("" + characterToShow, charX, (int) ((charDim - fontMetrics.getAscent()) / 2 + fontMetrics.getAscent()));
float x = horizMargin + spacePerChar * (i) - charDim / 2.0f;
int y = (int) ((height - charDim) / 2);
g.drawImage(charImage, (int) x, y, charDim, charDim, null, null);
charGraphics.dispose();
}
g.setColor(borderColor);
g.drawRect(0, 0, width - 1, height - 1);
Iterator iter = ImageIO.getImageWritersByFormatName(imageFormat);
if (iter.hasNext()) {
try
{
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
if (imageFormat.equalsIgnoreCase("jpg") || imageFormat.equalsIgnoreCase("jpeg")) {
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLIC IT);
iwp.setCompressionQuality(imageQuality);
}
writer.setOutput(ImageIO.createImageOutputStream(r esponse.getOutputStream()));
IIOImage imageIO = new IIOImage(bufferedImage, null, null);
writer.write(null, imageIO, iwp);
} catch (IOException ex) {
Logger.getLogger(MyReCaptcha.class.getName()).log( Level.SEVERE, null, ex);
}
} else {
throw new RuntimeException("no encoder found for jsp");
}
request.getSession().setAttribute("captcha", finalString.toString());
// Dogrulama kodunun dogrulugunu test icin session ataması g.dispose(); } catch (Exception ioe) {
throw new RuntimeException("Unable to build image", ioe);
}
}
public static String paramString(HttpServletRequest request, String paramName, String defaultString) {
return request.getParameter(paramName) != null ? request.getParameter(paramName) : defaultString;
}
public static int paramInt(HttpServletRequest request, String paramName, int defaultInt) {
return request.getParameter(paramName) != null ? Integer.parseInt(request.getParameter(paramName)) : defaultInt;
}
}
PHP Kod: Kodu kopyalamak için üzerine çift tıklayın!
<%-- Document : index Created on : 08.Eyl.2011, 09:50:24 Author : turgay --%>
<%@ Page import="util.MyReCaptcha"%>
<%@ Page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Ozel Dogrulama Kodu</title>
<style>
</style>
</head>
<body>
<table>
<tr>
<td>
<form method="POST" action="index.jsp">
<% MyReCaptcha cs = new MyReCaptcha(request, response);%>
<input type="text" name="recaptcha" id="recaptcha" />
<%if(session.getAttribute("captcha").equals(reques t.getParameter("recaptcha"))){ out.println("Dogru");
}else{
out.println("Yanlis");
}%>
</form>
</td>
</tr>
</table>
</body>
</html>
Kolay gelsin.
Kullanımda problem yaşayanlar, bu başlık altından sorabilir.
Kodlapaylas.com'u geliştirirken yazdığım makalelerden birisidir.