java 验证码生成

  • 格式:docx
  • 大小:30.24 KB
  • 文档页数:9

java 验证码生成验证码效果图import java.awt.Color;import java.awt.Font;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import javax.imageio.ImageIO;import javax.servlet.Servlet;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import ng.math.RandomUtils;import nl.captcha.Captcha;import nl.captcha.Captcha.Builder;import nl.captcha.gimpy.BlockGimpyRenderer;import nl.captcha.text.producer.ChineseTextProducer;import nl.captcha.text.producer.DefaultTextProducer;import nl.captcha.text.renderer.DefaultWordRenderer;import nl.captcha.text.renderer.WordRenderer;public class CaptchaServlet extends HttpServlet implements Servlet {private static final long serialVersionUID = 1L;private static final String PARAM_HEIGHT = "height"; // 高度默认为50 private static final String PARAM_WIDTH = "width";// 宽度默认为200private static final String PAEAM_NOISE = "noise";// 干扰线条默认是没有干扰线条private static final String PAEAM_TEXT = "text";// 文本protected int _width = 150;protected int _height = 40;protected boolean _noise = false;protected String _text ="number:1,word:1,number:1,number:1,word:1";/*** 初始化过滤器.将配置文件的参数文件赋值** @throws ServletException*/@Overridepublic void init() throws ServletException {if (getInitParameter(PARAM_HEIGHT) != null) {_height =Integer.valueOf(getInitParameter(PARAM_HEIGHT));}if (getInitParameter(PARAM_WIDTH) != null) {_width = Integer.valueOf(getInitParameter(PARAM_WIDTH)); }if (getInitParameter(PAEAM_NOISE) != null) {_noise = Boolean.valueOf(getInitParameter(PAEAM_NOISE));}if (getInitParameter(PAEAM_NOISE) != null) {_text = String.valueOf(getInitParameter(PAEAM_TEXT)); }}/*** 因为获取图片只会有get方法*/@Overridepublic void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Builder builder = new Captcha.Builder(_width, _height);// 增加边框// builder.addBorder();// 是否增加干扰线条if (_noise == true) {builder.addNoise();}// ----------------自定义字体大小-----------// 自定义设置字体颜色和大小最简单的效果多种字体随机显示 List<Font> fontList = new ArrayList<Font>();fontList.add(new Font("微软雅黑",YOUT_NO_START_CONTEXT, 30));// 可以设置斜体之类的 DefaultWordRenderer dwr = newDefaultWordRenderer(getRandomColor(), fontList);// 加入多种颜色后会随机显示字体空心WordRenderer wr = dwr;// 增加文本,默认为5个随机字符.if (_text == null) {builder.addText();} else {String[] ts = _text.split(",");for (int i = 0; i < ts.length; i++) {String[] ts1 = ts[i].split(":");if ("chinese".equals(ts1[0])) {builder.addText(newChineseTextProducer(Integer.parseInt(ts1[1])), wr);} else if ("number".equals(ts1[0])) {// 这里没有0和1是为了避免歧义和字母I和Ochar[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr); } else if ("word".equals(ts1[0])) {// 原理同上char[] numberChar = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r','w', 'x', 'y' };builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr); } else {builder.addText(newDefaultTextProducer(Integer.parseInt(ts1[1])), wr);}}}// --------------添加背景-------------// 设置背景渐进效果以及颜色 form为开始颜色,to为结束颜色// GradiatedBackgroundProducer gbp=new GradiatedBackgroundProducer();// gbp.setFromColor(Color.yellow);// gbp.setToColor(Color.red);// 无渐进效果,只是填充背景颜色// FlatColorBackgroundProducer fbp=new// FlatColorBackgroundProducer(Color.red);// 加入网纹--一般不会用// SquigglesBackgroundProducer sbp=new SquigglesBackgroundProducer();// 没发现有什么用,可能就是默认的// TransparentBackgroundProducer tbp = new// TransparentBackgroundProducer();// builder.addBackground(gbp);// ---------装饰字体---------------// 字体边框齿轮效果默认是3builder.gimp(new BlockGimpyRenderer(1));// 波纹渲染相当于加粗// builder.gimp(new RippleGimpyRenderer());// 修剪--一般不会用// builder.gimp(new ShearGimpyRenderer(Color.red));// 加网--第一个参数是横线颜色,第二个参数是竖线颜色// builder.gimp(newFishEyeGimpyRenderer(Color.red,Color.yellow));// 加入阴影效果默认3,75// builder.gimp(new DropShadowGimpyRenderer());// 创建对象Captcha captcha = builder.build();req.getSession().setAttribute("simpleCaptcha", captcha); resp.setHeader("Cache-Control","private,no-cache,no-store");resp.setContentType("image/png");try {OutputStream os = resp.getOutputStream();ImageIO.write(captcha.getImage(), "png", os);os.close();} catch (IOException e) {e.printStackTrace();}}public Color getRandomColor() {int n = RandomUtils.nextInt(100);if (n % 3 == 1) {return Color.RED;} else if (n % 3 == 2) {return Color.BLUE;}return Color.GREEN;}}</pre>。