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<Font> fontList = new ArrayList<Font>();
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;
}
}

java 验证码生成的更多相关文章

  1. JAVA 验证码生成(转)

    最近做了一下验证码的功能,网上找了一篇还不错,引用下:http://blog.csdn.net/ruixue0117/article/details/22829557 这篇文章非常好,但是web和js ...

  2. java验证码生成

    第一种方式:纯代码 先写jsp: 在编写CaptServlet: package cn.itcast.web.controller; import java.awt.Color; import jav ...

  3. Web后端 JAVA实现验证码生成与验证功能

    首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color;  impor ...

  4. java web中验证码生成的demo

    首先创建一个CaptailCode类 package com.xiaoqiang.code; import java.awt.*; import java.awt.font.FontRenderCon ...

  5. java中生成验证码,以及验证码的使用

    java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

  6. 用java Graphics生成验证码

    以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java ...

  7. Atitit 图片 验证码生成attilax总结

    Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字  打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...

  8. java验证码组件kaptcha使用方法

    使用方法: 项目中导入kaptcha-2.3.jar包在web.xml里面新增: <!-- 登陆验证码Kaptcha -->    <servlet>        <s ...

  9. Web---图片验证码生成教程详解-从简单到复杂-从本地到前后台

    首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现. 先来看最简单的-实现的功能是,将一个字符串变成图片写入到文件中 实现代码: package cn.hncu.img; im ...

随机推荐

  1. MacBook pro new 触控板手势及快捷键

    MacBook pro new 触控板手势:   显示桌面: 拇指+三指 向外张开 launchpad: 拇指+三指 向中间集中   正在运行的窗口:三指向上 应用浏览: 三指向下 窗口信息: 三指点 ...

  2. Android File Hierarchy : System Structure Architecture Layout

    Most of the Android user are using their Android phone just for calls, SMS, browsing and basic apps, ...

  3. [html5]使用localStorage兼容低版本Safari无法使用indexeddb的情况

    摘要 简单场景描述:将html5开发的app内嵌入ios app中,有部分数据,需要在本地存储,就想到使用浏览器的localstorage或者indexeddb,另外localstorage存储的方式 ...

  4. 【spring cloud】【docker】使用docker在centOS上部署spring cloud微服务架构服务

    项目GitHub地址 ================================================================================== 部署过程: ...

  5. anroid源码下载和编译

    本文是在Ubuntu10.10系统上进行实践的. 1 因为我们需要Android的模拟器,所以需要安装Android的SDK,并创建AVD, 可以一次命名为AVD15,AVD22,AVD23,... ...

  6. icanhazip.com 使你在不论什么地方知道你的公网IP地址

    icanhazip.com 使你在不论什么地方知道你的公网IP地址 icanhazip.com是一个网址,你在浏览器中输入这个网址,你就能得到你的公网IP地址了. 我在Linux下一般使用curl i ...

  7. weblogic 12C 安全加强:更改Console及管理端口

    一.管理端口的好处:1.由于我们使用的是weblogic直接提供web访问,所以防火墙无法对80端口做安全策略. 2.所有用户都可以使用http://www.reyo.cn/console/来登陆我们 ...

  8. SHA加密算法工具类

    1.利用Apache的工具类实现加密: maven: <dependency> <groupId>commons-codec</groupId> <artif ...

  9. NLP知识十大结构

    NLP知识十大结构 2.1形式语言与自动机 语言:按照一定规律构成的句子或者字符串的有限或者无限的集合. 描述语言的三种途径: 穷举法 文法(产生式系统)描述 自动机 自然语言不是人为设计而是自然进化 ...

  10. jwplayer 隐藏属性方法记载

    jwplayer().getPosition(): //播放了多少秒 jwplayer('playerdiv').play(); || jwplayer(0).play(true / false); ...