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. Android字体简述

    Android是一个典型的Linux内核的操作系统.在Android系统中,主要有DroidSans和DroidSerif两大字体阵营,从名字就可以看出来,前者是无衬线字体,后者是衬线字体.具体来说, ...

  2. 求平方根C++

    求平方根,正根.曾经都不会.昨天看数学,看到了,写了出来.自己又小优化了一下,非常不错. // squareRoot.cpp -- 2011-08-29-01.04 #include "st ...

  3. 安装wp8sdk 当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内。

    安装wp8sdk 当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内. [1404:0090][2015-06-12T08:00:53]: Error 0x800b0101: Failed ...

  4. Java 内存释放

     问题一什么叫垃圾回收机制 垃圾回收是一种动态存储管理技术它自动地释放不再被程序引用的对象按照特定的垃圾收集算法来实现资源自动回收的功能.当一个对象不再被引用的时候内存回收它占领的空间 ...

  5. 手机应用:非功能需求 Check List

    服务状态防止并发 网络保持:无线网络,GPRS 网络连接:https,手机助手代理 电量 屏幕保持防止休眠 下载重试机制 定时检查XML 限速下载,线程休眠 下载出错反馈机制 消息广播 状态栏通知 进 ...

  6. python测试开发django-4.获取url参数和name的作用

    前言 如打开博客园按时间分类标签页[https://www.cnblogs.com/yoyoketang/archive/2018/10.html],里面是时间参数是动态的,如果我想获取里面的时间参数 ...

  7. 用JavaScript,获取Table中指定的行、列

    前言: 先要谢谢George Wing的慷慨赠书<悟透JavaScript>,让我更加感受到了技术交流的重要性,呵呵~ 进入正题,面试题中有一题:如何通过JavaScript获取Table ...

  8. tomcat7.0.8的高级应用-apr1.4.2安装

    一 windows下安装 直接拷贝tcnative-1.dll到TOMCAT_HOME/bin目录下,启动即可 下载地址 http://archive.apache.org/dist/tomcat/t ...

  9. 一个VLAN配置的实际例子

    背景很简单,和一般的eth-switch通过VLAN做成路由的方式一样.     首先看一种硬件效率较高的方法: Port1~4作为access口,同时在硬件上作为用户模式,即从PC发往这些端口的数据 ...

  10. 《趣学Python编程》

    <趣学Python编程> 基本信息 作者: (美)Jason Briggs 译者: 尹哲 出版社:人民邮电出版社 ISBN:9787115335951 上架时间:2014-2-21 出版日 ...