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 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 验证码生成的更多相关文章
- JAVA 验证码生成(转)
最近做了一下验证码的功能,网上找了一篇还不错,引用下:http://blog.csdn.net/ruixue0117/article/details/22829557 这篇文章非常好,但是web和js ...
- java验证码生成
第一种方式:纯代码 先写jsp: 在编写CaptServlet: package cn.itcast.web.controller; import java.awt.Color; import jav ...
- Web后端 JAVA实现验证码生成与验证功能
首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color; impor ...
- java web中验证码生成的demo
首先创建一个CaptailCode类 package com.xiaoqiang.code; import java.awt.*; import java.awt.font.FontRenderCon ...
- java中生成验证码,以及验证码的使用
java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...
- 用java Graphics生成验证码
以下下是API文档对Graphics的介绍! Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制. Graphics 对象封装了 Java ...
- Atitit 图片 验证码生成attilax总结
Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字 打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...
- java验证码组件kaptcha使用方法
使用方法: 项目中导入kaptcha-2.3.jar包在web.xml里面新增: <!-- 登陆验证码Kaptcha --> <servlet> <s ...
- Web---图片验证码生成教程详解-从简单到复杂-从本地到前后台
首先,我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现. 先来看最简单的-实现的功能是,将一个字符串变成图片写入到文件中 实现代码: package cn.hncu.img; im ...
随机推荐
- composer安装Workerman报错:Installation failed, reverting ./composer.json to its original content.
今天想在TP5上安装workerman,实现一个后台消息提醒功能. 第一步就卡住了,根据手册里说的首先通过composer安装 $ composer require topthink/think-wo ...
- 快速重启 Quick Boot plus
Quick Boot(快速启动)可方便快速地重启/关闭您的设备,或将您的设备重启到恢复/引导模式,增强版还实现了热启动和Tasker/Locale插件集成功能.快速重启汉化版 Quick Boot p ...
- 提交改动到 github 远程服务器,怎么跳过要求输入密码的步骤
新机器上将工程改动提交到 github 服务器时,发现每次都要输入密码,这个有点儿小烦人,怎么解决这个问题呢? 首先,切换到工程根目录的 .git 隐藏目录,用 TextEdit 打开 config ...
- Delphi-Cross-Socket
Delphi-Cross-Socket GITHUB:https://github.com/winddriver/Delphi-Cross-Socket # Delphi 跨平台 Socket 通讯库 ...
- .NET:何时应该 “包装异常”?
背景 提到异常,我们会想到:抛出异常.异常恢复.资源清理.吞掉异常.重新抛出异常.替换异常.包装异常.本文想谈谈 “包装异常”,主要针对这个问题:何时应该 “包装异常”? “包装异常” 的技术形式 包 ...
- 一个VLAN配置的实际例子
背景很简单,和一般的eth-switch通过VLAN做成路由的方式一样. 首先看一种硬件效率较高的方法: Port1~4作为access口,同时在硬件上作为用户模式,即从PC发往这些端口的数据 ...
- Linux下安装Oracle的过程和涉及的知识点-系列6
16.一路安装后.会提示下面界面.此时须要用root登录下面文件夹,然后运行这两个脚本. 至此,Oracle软件的安装就已经完毕了,接下来就能够创建数据库了. 17.选择自己定义数据库: 输入数据库名 ...
- 【HDOJ】【3377】Plan
插头DP sigh……其实思路很简单的= =就多加一种转移:从(0,0)->(0,0),也就是不走这个格子…… 初始状态就是第一格有一个左插头= =结束状态可以让(n,m)这个位置可以走到(n+ ...
- Mongodb安全认证及Java调用
Mongodb安全认证在单实例和副本集两种情况下不太一样,单实例相对简单,只要在启动时加上 --auth参数即可,但副本集则需要keyfile. 一.单实例 1.启动服务(先不要加auth参数) 2. ...
- OpenCV学习(26) 直方图(3)
本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率.在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBa ...