java paenl_java 验证码生成

验证码效果图

64015f1ec12bdafc76a23a990063b3f5.png

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 org.apache.commons.lang.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";// 宽度 默认为200

private 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

*/

@Override

public 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方法

*/

@Override

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

Builder builder = new Captcha.Builder(_width, _height);

// 增加边框

// builder.addBorder();

// 是否增加干扰线条

if (_noise == true) {

builder.addNoise();

}

// ----------------自定义字体大小-----------

// 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示

List fontList = new ArrayList();

fontList.add(new Font("微软 雅黑", Font.LAYOUT_NO_START_CONTEXT, 30));// 可以设置斜体之类的

DefaultWordRenderer dwr = new DefaultWordRenderer(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(new ChineseTextProducer(Integer.parseInt(ts1[1])), wr);

} else if ("number".equals(ts1[0])) {

// 这里没有0和1是为了避免歧义 和字母I和O

char[] numberChar = new char[] { '2', '3', '4', '5', '6', '7', '8' };

builder.addText(new DefaultTextProducer(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(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);

} else {

builder.addText(new DefaultTextProducer(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);

// ---------装饰字体---------------

// 字体边框齿轮效果 默认是3

builder.gimp(new BlockGimpyRenderer(1));

// 波纹渲染 相当于加粗

// builder.gimp(new RippleGimpyRenderer());

// 修剪--一般不会用

// builder.gimp(new ShearGimpyRenderer(Color.red));

// 加网--第一个参数是横线颜色,第二个参数是竖线颜色

// builder.gimp(new FishEyeGimpyRenderer(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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值