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. composer安装Workerman报错:Installation failed, reverting ./composer.json to its original content.

    今天想在TP5上安装workerman,实现一个后台消息提醒功能. 第一步就卡住了,根据手册里说的首先通过composer安装 $ composer require topthink/think-wo ...

  2. 快速重启 Quick Boot plus

    Quick Boot(快速启动)可方便快速地重启/关闭您的设备,或将您的设备重启到恢复/引导模式,增强版还实现了热启动和Tasker/Locale插件集成功能.快速重启汉化版 Quick Boot p ...

  3. 提交改动到 github 远程服务器,怎么跳过要求输入密码的步骤

    新机器上将工程改动提交到 github 服务器时,发现每次都要输入密码,这个有点儿小烦人,怎么解决这个问题呢? 首先,切换到工程根目录的 .git 隐藏目录,用 TextEdit 打开 config ...

  4. Delphi-Cross-Socket

    Delphi-Cross-Socket GITHUB:https://github.com/winddriver/Delphi-Cross-Socket # Delphi 跨平台 Socket 通讯库 ...

  5. .NET:何时应该 “包装异常”?

    背景 提到异常,我们会想到:抛出异常.异常恢复.资源清理.吞掉异常.重新抛出异常.替换异常.包装异常.本文想谈谈 “包装异常”,主要针对这个问题:何时应该 “包装异常”? “包装异常” 的技术形式 包 ...

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

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

  7. Linux下安装Oracle的过程和涉及的知识点-系列6

    16.一路安装后.会提示下面界面.此时须要用root登录下面文件夹,然后运行这两个脚本. 至此,Oracle软件的安装就已经完毕了,接下来就能够创建数据库了. 17.选择自己定义数据库: 输入数据库名 ...

  8. 【HDOJ】【3377】Plan

    插头DP sigh……其实思路很简单的= =就多加一种转移:从(0,0)->(0,0),也就是不走这个格子…… 初始状态就是第一格有一个左插头= =结束状态可以让(n,m)这个位置可以走到(n+ ...

  9. Mongodb安全认证及Java调用

    Mongodb安全认证在单实例和副本集两种情况下不太一样,单实例相对简单,只要在启动时加上 --auth参数即可,但副本集则需要keyfile. 一.单实例 1.启动服务(先不要加auth参数) 2. ...

  10. OpenCV学习(26) 直方图(3)

    本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率.在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBa ...