1 41 package com.mvnforum.common; 42 43 import java.awt.Color ; 44 import java.awt.image.BufferedImage ; 45 import java.io.IOException ; 46 import java.io.OutputStream ; 47 import java.util.ArrayList ; 48 import java.util.Iterator ; 49 50 import javax.servlet.http.HttpServletRequest ; 51 import javax.servlet.http.HttpServletResponse ; 52 53 import com.mvnforum.auth.AuthenticationException; 54 import com.mvnforum.auth.OnlineUserManager; 55 import com.octo.captcha.component.image.backgroundgenerator.*; 56 import com.octo.captcha.component.image.fontgenerator.FontGenerator; 57 import com.octo.captcha.component.image.fontgenerator.TwistedAndShearedRandomFontGenerator; 58 import com.octo.captcha.component.image.textpaster.*; 59 import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage; 60 import com.octo.captcha.component.image.wordtoimage.WordToImage; 61 import com.octo.captcha.component.wordgenerator.RandomWordGenerator; 62 import com.octo.captcha.component.wordgenerator.WordGenerator; 63 import com.octo.captcha.engine.image.ListImageCaptchaEngine; 64 import com.octo.captcha.image.ImageCaptchaFactory; 65 import com.octo.captcha.image.gimpy.GimpyFactory; 66 import com.sun.image.codec.jpeg.JPEGCodec; 67 import com.sun.image.codec.jpeg.JPEGImageEncoder; 68 import net.myvietnam.mvncore.exception.AssertionException; 69 import net.myvietnam.mvncore.exception.DatabaseException; 70 71 public class MVNCaptchaService extends ListImageCaptchaEngine { 72 73 private static final Integer MIN_WORD_LENGTH = new Integer (6); 74 75 private static final Integer MAX_WORD_LENGTH = new Integer (8); 76 77 private static final Integer IMAGE_WIDTH = new Integer (380); 78 79 private static final Integer IMAGE_HEIGHT = new Integer (80); 80 81 private static final Integer MIN_FONT_SIZE = new Integer (44); 82 83 private static final Integer MAX_FONT_SIZE = new Integer (50); 84 85 private static final String NUMERIC_CHARS = "123456789"; 87 private static final String UPPER_ASCII_CHARS= "ABCDEFGHJKLMNPQRSTUVWXYZ"; 89 93 96 private static MVNCaptchaService instance = new MVNCaptchaService(); 97 98 private ArrayList textPasterList; 99 100 private ArrayList backgroundGeneratorList; 101 102 private ArrayList fontGeneratorList; 103 104 107 private MVNCaptchaService() { 108 } 109 110 public static MVNCaptchaService getInstance() { 111 return instance; 112 } 113 114 protected void buildInitialFactories() { 115 textPasterList = new ArrayList (); 116 backgroundGeneratorList = new ArrayList (); 117 fontGeneratorList = new ArrayList (); 118 119 textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.green)); 120 textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.green)); 121 textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.red)); 122 textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.red)); 123 textPasterList.add(new SimpleTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.blue)); 124 textPasterList.add(new RandomTextPaster(MIN_WORD_LENGTH, MAX_WORD_LENGTH, Color.blue)); 125 126 backgroundGeneratorList.add(new EllipseBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT)); 127 backgroundGeneratorList.add(new UniColorBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT)); 128 backgroundGeneratorList.add(new MultipleShapeBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT)); 129 backgroundGeneratorList.add(new FunkyBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT)); 130 backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.white, Color.black)); 131 backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.black, Color.white)); 132 backgroundGeneratorList.add(new GradientBackgroundGenerator(IMAGE_WIDTH, IMAGE_HEIGHT, Color.orange, Color.magenta)); 133 142 143 fontGeneratorList.add(new TwistedAndShearedRandomFontGenerator(MIN_FONT_SIZE, MAX_FONT_SIZE)); 144 148 WordGenerator words = new RandomWordGenerator(NUMERIC_CHARS + UPPER_ASCII_CHARS); 150 151 for (Iterator fontIter = fontGeneratorList.iterator(); fontIter.hasNext(); ) { 152 FontGenerator font = (FontGenerator)fontIter.next(); 153 for (Iterator backIter = backgroundGeneratorList.iterator(); backIter.hasNext(); ) { 154 BackgroundGenerator back = (BackgroundGenerator)backIter.next(); 155 for (Iterator textIter = textPasterList.iterator(); textIter.hasNext(); ) { 156 TextPaster parser = (TextPaster)textIter.next(); 157 158 WordToImage word2image = new ComposedWordToImage(font, back, parser); 159 ImageCaptchaFactory factory = new GimpyFactory(words, word2image); 160 addFactory(factory); 161 } 162 } 163 } 164 } 165 166 173 public void writeCaptchaImage(HttpServletRequest request, HttpServletResponse response) 174 throws IOException , AssertionException, DatabaseException, AuthenticationException { 175 176 BufferedImage image = OnlineUserManager.getInstance().getOnlineUser(request).getCurrentCaptchaImage(); 177 if (image == null) { 178 return; 179 } 180 181 OutputStream outputStream = null; 182 try { 183 outputStream = response.getOutputStream(); 184 response.setContentType("image/jpeg"); 185 186 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream); 187 encoder.encode(image); 188 189 outputStream.flush(); 190 outputStream.close(); 191 outputStream = null; } catch (IOException ex) { 193 throw ex; 194 } finally { 195 if (outputStream != null) { 196 try { 197 outputStream.close(); 198 } catch (IOException ex) { } 199 } 200 } 201 } 202 203 279 } 280 | Popular Tags |