diff --git a/.gitignore b/.gitignore
index f6eee71..82eca33 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,24 +1,25 @@
-# Compiled class file
-*.class
+/target/
+!.mvn/wrapper/maven-wrapper.jar
-# Log file
-*.log
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
-# BlueJ files
-*.ctxt
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-/bin
-/target
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..b26911b
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
- * 验证码抽象类,暂时不支持中文 - *
- * - * @author: wuhongjun - * @version:1.0 + * 验证码抽象类 + * Created by 王帆 on 2018-07-27 上午 10:08. */ public abstract class Captcha extends Randoms { - protected Font font = new Font("Verdana", Font.ITALIC | Font.BOLD, 28); // 字体 - protected int len = 5; // 验证码随机字符长度 - protected int width = 150; // 验证码显示跨度 - protected int height = 40; // 验证码显示高度 - private String chars = null; // 随机字符串 + protected Font font = new Font("Verdana", Font.ITALIC | Font.BOLD, 28); // 字体 + protected int len = 5; // 验证码随机字符长度 + protected int width = 150; // 验证码显示宽度 + protected int height = 40; // 验证码显示高度 + private String chars = null; // 当前验证码 - /** - * 生成随机字符数组 - * - * @return 字符数组 - */ - protected char[] alphas() { - char[] cs = new char[len]; - for (int i = 0; i < len; i++) { - cs[i] = alpha(); - } - chars = new String(cs); - return cs; - } + /** + * 生成随机验证码 + * + * @return 验证码字符数组 + */ + protected char[] alphas() { + char[] cs = new char[len]; + for (int i = 0; i < len; i++) { + cs[i] = alpha(); + } + chars = new String(cs); + return cs; + } - public Font getFont() { - return font; - } + /** + * 给定范围获得随机颜色 + * + * @param fc 0-255 + * @param bc 0-255 + * @return 随机颜色 + */ + protected Color color(int fc, int bc) { + if (fc > 255) + fc = 255; + if (bc > 255) + bc = 255; + int r = fc + num(bc - fc); + int g = fc + num(bc - fc); + int b = fc + num(bc - fc); + return new Color(r, g, b); + } - public void setFont(Font font) { - this.font = font; - } + /** + * 验证码输出,抽象方法,由子类实现 + * + * @param os 输出流 + * @return 是否成功 + */ + public abstract boolean out(OutputStream os); - public int getLen() { - return len; - } + /** + * 获取当前的验证码 + * + * @return 字符串 + */ + public String text() { + checkAlpha(); + return chars; + } - public void setLen(int len) { - this.len = len; - } + /** + * 获取当前验证码的字符数组 + * + * @return 字符数组 + */ + public char[] textChar() { + checkAlpha(); + return chars.toCharArray(); + } - public int getWidth() { - return width; - } + /** + * 检查验证码是否生成,没有这立即生成 + */ + public void checkAlpha() { + if (chars == null) { + alphas(); // 生成验证码 + } + } - public void setWidth(int width) { - this.width = width; - } + public Font getFont() { + return font; + } - public int getHeight() { - return height; - } + public void setFont(Font font) { + this.font = font; + } - public void setHeight(int height) { - this.height = height; - } + public int getLen() { + return len; + } - /** - * 给定范围获得随机颜色 - * - * @return Color 随机颜色 - */ - protected Color color(int fc, int bc) { - if (fc > 255) - fc = 255; - if (bc > 255) - bc = 255; - int r = fc + num(bc - fc); - int g = fc + num(bc - fc); - int b = fc + num(bc - fc); - return new Color(r, g, b); - } + public void setLen(int len) { + this.len = len; + } - /** - * 验证码输出,抽象方法,由子类实现 - * - * @param os - * 输出流 - */ - public abstract void out(OutputStream os); + public int getWidth() { + return width; + } - /** - * 获取随机字符串 - * - * @return string - */ - public String text() { - return chars; - } - - public char[] textChar() { - return chars.toCharArray(); - } + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } } \ No newline at end of file diff --git a/src/main/java/com/wf/captcha/Encoder.java b/src/main/java/com/wf/captcha/Encoder.java index f934d4a..70cf4bd 100644 --- a/src/main/java/com/wf/captcha/Encoder.java +++ b/src/main/java/com/wf/captcha/Encoder.java @@ -4,40 +4,20 @@ import java.io.IOException; import java.io.OutputStream; /** - * @author: wuhongjun - * @version:1.0 + * */ -public class Encoder -{ +public class Encoder { private static final int EOF = -1; - + // 图片的宽高 private int imgW, imgH; private byte[] pixAry; - private int initCodeSize; - private int remaining; - private int curPixel; - - // GIFCOMPR.C - GIF Image compression routines - // - // Lempel-Ziv compression based on 'compress'. GIF modifications by - // David Rowley (mgardi@watdcsu.waterloo.edu) - - // General DEFINEs + private int initCodeSize; // 验证码位数 + private int remaining; // 剩余数量 + private int curPixel; // 像素 static final int BITS = 12; - static final int HSIZE = 5003; // 80% occupancy - - // GIF Image compression - modified 'compress' - // - // Based on: compress.c - File compression ala IEEE Computer, June 1984. - // - // By Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) - // Jim McKie (decvax!mcvax!jim) - // Steve Davies (decvax!vax135!petsd!peora!srd) - // Ken Turkowski (decvax!decwrl!turtlevax!ken) - // James A. Woods (decvax!ihnp4!ames!jaw) - // Joe Orost (decvax!vax135!petsd!joe) + static final int HSIZE = 5003; // 80% 占用率 int n_bits; // number of bits/code int maxbits = BITS; // user settable max # bits/code @@ -108,7 +88,7 @@ public class Encoder 0x1FFF, 0x3FFF, 0x7FFF, - 0xFFFF }; + 0xFFFF}; // Number of characters so far in this 'packet' int a_count; @@ -184,7 +164,8 @@ public class Encoder output(ClearCode, outs); - outer_loop : while ((c = nextPixel()) != EOF) { + outer_loop: + while ((c = nextPixel()) != EOF) { fcode = (c << maxbits) + ent; i = (c << hshift) ^ ent; // xor hashing diff --git a/src/main/java/com/wf/captcha/GifCaptcha.java b/src/main/java/com/wf/captcha/GifCaptcha.java index 38bc874..4962194 100644 --- a/src/main/java/com/wf/captcha/GifCaptcha.java +++ b/src/main/java/com/wf/captcha/GifCaptcha.java @@ -7,98 +7,87 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; + /** - *Gif验证码类
- * - * @author: wuhongjun - * @version:1.0 + * Gif验证码类 + * Created by 王帆 on 2018-07-27 上午 10:08. */ -public class GifCaptcha extends Captcha -{ - public GifCaptcha() - { +public class GifCaptcha extends Captcha { + + public GifCaptcha() { } - public GifCaptcha(int width,int height){ - this.width = width; - this.height = height; - alphas(); + public GifCaptcha(int width, int height) { + setWidth(width); + setHeight(height); } - public GifCaptcha(int width,int height,int len){ - this(width,height); - this.len = len; + public GifCaptcha(int width, int height, int len) { + this(width, height); + setLen(len); } - public GifCaptcha(int width,int height,int len,Font font) - { - this(width,height,len); - this.font = font; + public GifCaptcha(int width, int height, int len, Font font) { + this(width, height, len); + setFont(font); } @Override - public void out(OutputStream os) - { - try - { - GifEncoder gifEncoder = new GifEncoder(); // gif编码类,这个利用了洋人写的编码类,所有类都在附件中 - //生成字符 + public boolean out(OutputStream os) { + checkAlpha(); + boolean ok = false; + try { + char[] rands = textChar(); // 获取验证码数组 + GifEncoder gifEncoder = new GifEncoder(); gifEncoder.start(os); gifEncoder.setQuality(180); gifEncoder.setDelay(100); gifEncoder.setRepeat(0); BufferedImage frame; - char[] rands = textChar(); - Color fontcolor[]=new Color[len]; - for(int i=0;i@@ -25,13 +26,8 @@ import java.io.OutputStream; * for any purpose, however, refer to the Unisys LZW patent for restrictions * on use of the associated Encoder class. Please forward any corrections * to questions at fmsware.com. - * - * @author wuhongjun - * @version 1.03 November 2003 - * */ -public class GifEncoder -{ +public class GifEncoder { protected int width; // image size protected int height; protected Color transparent = null; // transparent color if given @@ -67,6 +63,7 @@ public class GifEncoder * Sets the GIF frame disposal code for the last added frame * and any subsequent frames. Default is 0 if no transparent * color has been set, otherwise 2. + * * @param code int disposal code. */ public void setDispose(int code) { @@ -322,7 +319,6 @@ public class GifEncoder /** * Returns index of palette color closest to c - * */ protected int findClosest(Color c) { if (colorTab == null) return -1; @@ -332,7 +328,7 @@ public class GifEncoder int minpos = 0; int dmin = 256 * 256 * 256; int len = colorTab.length; - for (int i = 0; i < len;) { + for (int i = 0; i < len; ) { int dr = r - (colorTab[i++] & 0xff); int dg = g - (colorTab[i++] & 0xff); int db = b - (colorTab[i] & 0xff); @@ -473,7 +469,7 @@ public class GifEncoder } /** - * Write 16-bit value to output stream, LSB first + * Write 16-bit value to output stream, LSB first */ protected void writeShort(int value) throws IOException { out.write(value & 0xff); diff --git a/src/main/java/com/wf/captcha/Quant.java b/src/main/java/com/wf/captcha/Quant.java index cee82c8..ed6cbf9 100644 --- a/src/main/java/com/wf/captcha/Quant.java +++ b/src/main/java/com/wf/captcha/Quant.java @@ -1,24 +1,20 @@ package com.wf.captcha; /** - * * - * @author: wuhongjun - * @version:1.0 */ -public class Quant -{ +public class Quant { protected static final int netsize = 256; /* number of colours used */ /* four primes near 500 - assume no image has a length so large */ - /* that it is divisible by all four primes */ + /* that it is divisible by all four primes */ protected static final int prime1 = 499; protected static final int prime2 = 491; protected static final int prime3 = 487; protected static final int prime4 = 503; protected static final int minpicturebytes = (3 * prime4); - /* minimum size for input image */ + /* minimum size for input image */ /* Program Skeleton ---------------- @@ -80,13 +76,13 @@ public class Quant protected int[][] network; /* the network itself - [netsize][4] */ protected int[] netindex = new int[256]; - /* for network lookup - really 256 */ + /* for network lookup - really 256 */ protected int[] bias = new int[netsize]; /* bias and freq arrays for learning */ protected int[] freq = new int[netsize]; protected int[] radpower = new int[initrad]; - /* radpower for precomputation */ + /* radpower for precomputation */ /* Initialise network in range (0,0,0) to (255,255,255) and set parameters ----------------------------------------------------------------------- */ @@ -139,7 +135,7 @@ public class Quant p = network[i]; smallpos = i; smallval = p[1]; /* index on g */ - /* find smallest in i..netsize-1 */ + /* find smallest in i..netsize-1 */ for (j = i + 1; j < netsize; j++) { q = network[j]; if (q[1] < smallval) { /* index on g */ @@ -148,7 +144,7 @@ public class Quant } } q = network[smallpos]; - /* swap p (i) and q (smallpos) entries */ + /* swap p (i) and q (smallpos) entries */ if (i != smallpos) { j = q[0]; q[0] = p[0]; @@ -163,7 +159,7 @@ public class Quant q[3] = p[3]; p[3] = j; } - /* smallval entry is now in position i */ + /* smallval entry is now in position i */ if (smallval != previouscol) { netindex[previouscol] = (startpos + i) >> 1; for (j = previouscol + 1; j < smallval; j++) @@ -320,6 +316,7 @@ public class Quant } return (best); } + public byte[] process() { learn(); unbiasnet(); @@ -385,7 +382,7 @@ public class Quant ---------------------------------------------------- */ protected void altersingle(int alpha, int i, int b, int g, int r) { - /* alter hit neuron */ + /* alter hit neuron */ int[] n = network[i]; n[0] -= (alpha * (n[0] - b)) / initalpha; n[1] -= (alpha * (n[1] - g)) / initalpha; @@ -396,10 +393,10 @@ public class Quant ---------------------------- */ protected int contest(int b, int g, int r) { - /* finds closest neuron (min dist) and updates freq */ - /* finds best neuron (min dist-bias) and returns position */ - /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */ - /* bias[i] = gamma*((1/netsize)-freq[i]) */ + /* finds closest neuron (min dist) and updates freq */ + /* finds best neuron (min dist-bias) and returns position */ + /* for frequently chosen neurons, freq[i] is high and bias[i] is negative */ + /* bias[i] = gamma*((1/netsize)-freq[i]) */ int i, dist, a, biasdist, betafreq; int bestpos, bestbiaspos, bestd, bestbiasd; diff --git a/src/main/java/com/wf/captcha/Randoms.java b/src/main/java/com/wf/captcha/Randoms.java index 158b105..6c4127e 100644 --- a/src/main/java/com/wf/captcha/Randoms.java +++ b/src/main/java/com/wf/captcha/Randoms.java @@ -3,41 +3,64 @@ package com.wf.captcha; import java.util.Random; /** - *随机工具类
- * - * @author: wuhongjun - * @version:1.0 + * 随机数工具类 + * Created by 王帆 on 2018-07-27 上午 10:08. */ -public class Randoms -{ +public class Randoms { private static final Random RANDOM = new Random(); - //定义验证码字符.去除了O和I等容易混淆的字母 - public static final char ALPHA[]={'A','B','C','D','E','F','G','H','G','K','M','N','P','Q','R','S','T','U','V','W','X','Y','Z' - ,'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','8','9'}; + // 定义验证码字符.去除了O和I等容易混淆的字母 + public static final char ALPHA[] = {'2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'G', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; /** * 产生两个数之间的随机数 - * @param min 小数 - * @param max 比min大的数 - * @return int 随机数字 + * + * @param min 最小值 + * @param max 最大值 + * @return 随机数 */ - public static int num(int min, int max) - { + public static int num(int min, int max) { return min + RANDOM.nextInt(max - min); } /** - * 产生0--num的随机数,不包括num - * @param num 数字 - * @return int 随机数字 + * 产生0-num的随机数,不包括num + * + * @param num 最大值 + * @return 随机数 */ - public static int num(int num) - { + public static int num(int num) { return RANDOM.nextInt(num); } - public static char alpha() - { - return ALPHA[num(0, ALPHA.length)]; + /** + * 返回ALPHA中的随机字符 + * + * @return 随机字符 + */ + public static char alpha() { + return ALPHA[num(ALPHA.length)]; + } + + /** + * 返回ALPHA中第0位到第num位的随机字符 + * + * @param num 到第几位结束 + * @return 随机字符 + */ + public static char alpha(int num) { + return ALPHA[num(num)]; + } + + /** + * 返回ALPHA中第min位到第max位的随机字符 + * + * @param min 从第几位开始 + * @param max 到第几位结束 + * @return 随机字符 + */ + public static char alpha(int min, int max) { + return ALPHA[num(min, max)]; } } \ No newline at end of file diff --git a/src/main/java/com/wf/captcha/SpecCaptcha.java b/src/main/java/com/wf/captcha/SpecCaptcha.java index 12c693c..4899dad 100644 --- a/src/main/java/com/wf/captcha/SpecCaptcha.java +++ b/src/main/java/com/wf/captcha/SpecCaptcha.java @@ -9,90 +9,93 @@ import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; + /** - *png格式验证码
- * - * @author: wuhongjun - * @version:1.0 + * png格式验证码 + * Created by 王帆 on 2018-07-27 上午 10:08. */ -public class SpecCaptcha extends Captcha -{ - public SpecCaptcha() - { +public class SpecCaptcha extends Captcha { + + public SpecCaptcha() { } - public SpecCaptcha(int width, int height) - { - this.width = width; - this.height = height; + + public SpecCaptcha(int width, int height) { + setWidth(width); + setHeight(height); } - public SpecCaptcha(int width, int height, int len){ - this(width,height); - this.len = len; + + public SpecCaptcha(int width, int height, int len) { + this(width, height); + setLen(len); } - public SpecCaptcha(int width, int height, int len, Font font){ - this(width,height,len); - this.font = font; - } - /** - * 生成验证码 - * @throws java.io.IOException IO异常 - */ - @Override - public void out(OutputStream out){ - graphicsImage(alphas(), out); + + public SpecCaptcha(int width, int height, int len, Font font) { + this(width, height, len); + setFont(font); } /** - * 画随机码图 - * @param strs 文本 + * 生成验证码 + * * @param out 输出流 + * @return 是否成功 */ - private boolean graphicsImage(char[] strs, OutputStream out){ - boolean ok = false; - try - { - BufferedImage bi = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); - Graphics2D g = (Graphics2D)bi.getGraphics(); + @Override + public boolean out(OutputStream out) { + checkAlpha(); + return graphicsImage(textChar(), out); + } + + /** + * 生成验证码图形 + * + * @param strs 验证码 + * @param out 输出流 + * @return boolean + */ + private boolean graphicsImage(char[] strs, OutputStream out) { + boolean ok; + try { + BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + Graphics2D g = (Graphics2D) bi.getGraphics(); AlphaComposite ac3; - Color color ; + Color color; int len = strs.length; g.setColor(Color.WHITE); - g.fillRect(0,0,width,height); - // 随机画干扰的蛋蛋 - for(int i=0;i<15;i++){ + g.fillRect(0, 0, width, height); + // 随机画干扰的圆圈 + for (int i = 0; i < 15; i++) { color = color(150, 250); g.setColor(color); - g.drawOval(num(width), num(height), 5+num(10), 5+num(10));// 画蛋蛋,有蛋的生活才精彩 + g.drawOval(num(width), num(height), 5 + num(10), 5 + num(10)); color = null; } g.setFont(font); - int h = height - ((height - font.getSize()) >>1), - w = width/len, - size = w-font.getSize()+1; - /* 画字符串 */ - for(int i=0;i> 1); + int w = width / len; + int size = w - font.getSize() + 1; + // 画字符串 + for (int i = 0; i < len; i++) { ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);// 指定透明度 g.setComposite(ac3); color = new Color(20 + num(110), 20 + num(110), 20 + num(110));// 对每个字符都用随机颜色 g.setColor(color); - g.drawString(strs[i]+"",(width-(len-i)*w)+size, h-4); + g.drawString(String.valueOf(strs[i]), (width - (len - i) * w) + size, h - 4); color = null; ac3 = null; } ImageIO.write(bi, "png", out); out.flush(); ok = true; - }catch (IOException e){ + } catch (IOException e) { ok = false; - }finally - { - try { - out.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + e.printStackTrace(); + } finally { + try { + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } } return ok; } diff --git a/src/main/java/com/wf/captcha/servlet/CaptchaServlet.java b/src/main/java/com/wf/captcha/servlet/CaptchaServlet.java index ee5d777..e273a03 100644 --- a/src/main/java/com/wf/captcha/servlet/CaptchaServlet.java +++ b/src/main/java/com/wf/captcha/servlet/CaptchaServlet.java @@ -11,23 +11,14 @@ import com.wf.captcha.utils.CaptchaUtil; /** * 验证码servlet - * - * @author wangfan - * @date 2018-5-14 上午9:53:01 + * Created by 王帆 on 2018-07-27 上午 10:08. */ public class CaptchaServlet extends HttpServlet { private static final long serialVersionUID = -90304944339413093L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - // 是否有key决定是存在session中还是servletContext中 - String key = request.getParameter("key"); - CaptchaUtil cu = new CaptchaUtil(); - if (key != null && !key.trim().isEmpty()) { - cu.out(key, request, response); - } else { - cu.out(request, response); - } + CaptchaUtil.out(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) diff --git a/src/main/java/com/wf/captcha/utils/CaptchaUtil.java b/src/main/java/com/wf/captcha/utils/CaptchaUtil.java index ea11f7f..23cb243 100644 --- a/src/main/java/com/wf/captcha/utils/CaptchaUtil.java +++ b/src/main/java/com/wf/captcha/utils/CaptchaUtil.java @@ -2,7 +2,6 @@ package com.wf.captcha.utils; import java.io.IOException; -import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -11,136 +10,75 @@ import com.wf.captcha.GifCaptcha; /** * 图形验证码工具类 - * - * @author wangfan - * @date 2018-5-14 上午9:41:06 + * Created by 王帆 on 2018-07-27 上午 10:08. */ public class CaptchaUtil { - private String codeName = "captcha"; - private int width = 130; - private int height = 38; - private int len = 5; + private static final String SESSION_KEY = "captcha"; - public CaptchaUtil() { - } + /** + * 验证验证码 + */ + public static boolean ver(String code, HttpServletRequest request) { + if (code != null && !code.trim().isEmpty()) { + String captcha = (String) request.getSession().getAttribute(SESSION_KEY); + return code.trim().toLowerCase().equals(captcha); + } + return false; + } - /** - * 验证码的宽、高、位数 - */ - public CaptchaUtil(int width, int height, int len) { - set(width, height, len); - } + /** + * 输出验证码 + * + * @param request + * @param response + * @throws IOException + */ + public static void out(HttpServletRequest request, HttpServletResponse response) + throws IOException { + out(130, 38, 5, request, response); + } - /** - * 验证验证码 - */ - public boolean ver(String code, HttpServletRequest request) { - String captcha = (String) request.getSession().getAttribute(codeName); - return code.equals(captcha); - } + /** + * 输出验证码 + * + * @param len 长度 + * @param request + * @param response + * @throws IOException + */ + public static void out(int len, HttpServletRequest request, HttpServletResponse response) + throws IOException { + out(130, 38, len, request, response); + } - /** - * 验证验证码,用于分离的项目 - */ - public boolean ver(String key, String code, HttpServletRequest rq) { - ServletContext sc = rq.getServletContext(); - String keyName = codeName + "-" + key; - String captcha = (String) sc.getAttribute(keyName); - return code.equals(captcha); - } + /** + * 输出验证码 + * + * @param width 宽度 + * @param height 高度 + * @param len 长度 + * @param request + * @param response + * @throws IOException + */ + public static void out(int width, int height, int len, HttpServletRequest request, HttpServletResponse response) + throws IOException { + setHeader(response); + Captcha captcha = new GifCaptcha(130, 38, 5); + request.getSession().setAttribute(SESSION_KEY, captcha.text().toLowerCase()); + captcha.out(response.getOutputStream()); + } - /** - * 输出验证码 - */ - public void out(HttpServletRequest rq, HttpServletResponse rp) - throws IOException { + /** + * 设置相应头 + * + * @param response + */ + private static void setHeader(HttpServletResponse response) { + response.setContentType("image/gif"); + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "no-cache"); + response.setDateHeader("Expires", 0); + } - setHeader(rp); - - // 验证码的宽、高、位数 - Captcha captcha = new GifCaptcha(width, height, len); - // 存入缓存 - rq.getSession().setAttribute(codeName, captcha.text().toLowerCase()); - - // 输入图片 - captcha.out(rp.getOutputStream()); - } - - /** - * 输出验证码,用于分离项目 - */ - public void out(String key, HttpServletRequest rq, HttpServletResponse rp) - throws IOException { - - setHeader(rp); - - // 验证码的宽、高、位数 - Captcha captcha = new GifCaptcha(width, height, len); - // 存入缓存 - ServletContext sc = rq.getServletContext(); - sc.setAttribute(codeName, captcha.text().toLowerCase()); - - // 输入图片 - captcha.out(rp.getOutputStream()); - } - - private void setHeader(HttpServletResponse rp) { - rp.setContentType("image/gif"); - rp.setHeader("Pragma", "No-cache"); - rp.setHeader("Cache-Control", "no-cache"); - rp.setDateHeader("Expires", 0); - } - - public String getCodeName() { - return codeName; - } - - /** - * 设置保存code的key - */ - public void setCodeName(String codeName) { - this.codeName = codeName; - } - - public int getWidth() { - return width; - } - - /** - * 设置验证码的宽度 - */ - public void setWidth(int width) { - this.width = width; - } - - public int getHeight() { - return height; - } - - /** - * 设置验证码的高度 - */ - public void setHeight(int height) { - this.height = height; - } - - public int getLen() { - return len; - } - - /** - * 设置验证码的位数 - */ - public void setLen(int len) { - this.len = len; - } - - /** - * 设置验证码的宽、高、位数 - */ - public void set(int width, int height, int len) { - setWidth(width); - setHeight(height); - setLen(len); - } } diff --git a/src/test/java/com/wf/captcha/CaptchaTest.java b/src/test/java/com/wf/captcha/CaptchaTest.java new file mode 100644 index 0000000..1a25a47 --- /dev/null +++ b/src/test/java/com/wf/captcha/CaptchaTest.java @@ -0,0 +1,27 @@ +package com.wf.captcha; + +import org.junit.Test; + +import java.io.File; +import java.io.FileOutputStream; + +/** + * 测试类 + * Created by 王帆 on 2018-07-27 上午 10:08. + */ +public class CaptchaTest { + + @Test + public void test() throws Exception { + SpecCaptcha specCaptcha = new SpecCaptcha(150, 40, 4); + System.out.println(specCaptcha.text()); + specCaptcha.out(new FileOutputStream(new File("D:/a/aa.png"))); + } + + @Test + public void testGIf() throws Exception { + GifCaptcha specCaptcha = new GifCaptcha(150, 40, 4); + System.out.println(specCaptcha.text()); + specCaptcha.out(new FileOutputStream(new File("D:/a/aa.gif"))); + } +}