YazılımMimarı | 27 Ağustos 2012 08:58 | JSP ile özel dogrulama kodu implementasyon örneği Merhaba,
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 Kütüphaneler PHP- Kodu: 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- Kodu: <%-- 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>
Ekran çıktısı ; [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
Kolay gelsin.
Kullanımda problem yaşayanlar, bu başlık altından sorabilir.
Kodlapaylas.com'u geliştirirken yazdığım makalelerden birisidir. [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] |