JSP ile özel dogrulama kodu implementasyon örneği ve değerleri

DrogbA

Forum Üyesi
Katılım
27 Ara 2020
Mesajlar
3,440
Tepkime puanı
0
Puanları
36
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'ı.

MyReCaptcha.java

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


Arayüzde kullanımı


index.jsp

PHP:
<%-- 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>


 

Nutella

Bayan Üye
Özel Üye
Katılım
2 Ocak 2021
Mesajlar
3,559
Tepkime puanı
23
Puanları
36
Cinsiyet
  1. Bayan
Takım
Galatasaray
Paylaşım için teşekkürler.
 

Vedat

Forum Üyesi
Katılım
23 Eyl 2021
Mesajlar
3,484
Tepkime puanı
1
Puanları
36
Takım
Kasımpaşa
Teşekkür ediyorum.
 
metal işleme
Üst