- 在项目中手动引入simplecaptcha-1.2.1.jar或在pom.xml中引入
<dependency>
<groupId>nl.captcha</groupId>
<artifactId>simplecaptcha</artifactId>
<version>1.2.1</version>
</dependency>
- 在web.xml中增加配置,设置验证码的宽高和个数
-
<servlet> <servlet-name>StickyCaptcha</servlet-name> <!-- <servlet-class>nl.captcha.servlet.StickyCaptchaServlet</servlet-class> --> <servlet-class>org.jasig.cas.web.SimpleCaptchaFilter</servlet-class> <init-param> <param-name>width</param-name> <param-value>120</param-value> </init-param> <init-param> <param-name>height</param-name> <param-value>38</param-value> </init-param> <!-- 验证码个数 --> <init-param> <param-name>text</param-name> <param-value>4</param-value> </init-param> </servlet>
- 在需要引入随机验证码的jsp页面中添加验证码标签
<div style="width: 250px">
<img src="/cas/stickyImg" id="validate" style="border-radius:4px;height:36px;" onclick="getNewPic()"/>
<form:input name="validateCode" id="validateCode" class="form-control" style="width:120px;" tabindex="3" size="25" path="validateCode" />
</div>
<script>
function getNewPic(){
$("#validate").attr("src","/cas/stickyImg?seed="+ RndNum(5));
}
function RndNum(n){
var rnd="";
for(var i=0;i<n;i++)
rnd += Math.floor(Math.random()*10);
return rnd;
}
</script>
- 创建captchaSubmit.jsp,与需要添加随机验证码的jsp放在同一目录下
<%@ page import="nl.captcha.Captcha" %>
...
<% // We're doing this in a JSP here, but in your own app you'll want to put
// this logic in your MVC framework of choice.
Captcha captcha = (Captcha) session.getAttribute(Captcha.NAME);
// Or, for an AudioCaptcha:
// AudioCaptcha captcha = (AudioCaptcha) session.getAttribute(Captcha.NAME);
request.setCharacterEncoding("UTF-8"); // Do this so we can capture non-Latin chars
String answer = request.getParameter("answer");
if (captcha.isCorrect(answer)) { %>
<b>Correct!</b>
<% } %>
- 创建SimpleCaptchaFilter.java
package org.jasig.cas.web;
import static nl.captcha.Captcha.NAME;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import nl.captcha.Captcha;
import nl.captcha.backgrounds.GradiatedBackgroundProducer;
import nl.captcha.gimpy.FishEyeGimpyRenderer;
import nl.captcha.servlet.CaptchaServletUtil;
public class SimpleCaptchaFilter extends HttpServlet{
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 = 200;
protected int _height = 50;
protected boolean _noise=false;
protected int _text = 4;
/**
* 初始化过滤器.将配置文件的参数文件赋值
* @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_TEXT) != null) {
_text = Integer.valueOf(getInitParameter(PAEAM_TEXT));
}
}
/**
* 因为获取图片只会有get方法
*/
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//----------------自定义字体大小-----------
//自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
List<Font> fontList = new ArrayList<Font>();
fontList.add(new Font("宋体", Font.HANGING_BASELINE, 40));// 可以设置斜体之类的
fontList.add(new Font("Courier", Font.ITALIC, 40));
fontList.add(new Font("宋体", Font.PLAIN, 40));
//--------------添加背景-------------
//设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
GradiatedBackgroundProducer gbp = new GradiatedBackgroundProducer();
gbp.setFromColor(Color.black);
gbp.setToColor(Color.black);
Captcha captcha = new Captcha.Builder(_width, _height)
.addText(new EasyCharTextProducer(_text),
new FixedWordRenderer(new Color(250, 160, 0), fontList))
.gimp(new FishEyeGimpyRenderer(new Color(145, 165, 192),new Color(145, 165, 192)))
.addBackground(gbp).addBorder().build();
CaptchaServletUtil.writeImage(resp, captcha.getImage());
req.getSession().setAttribute(NAME, captcha);
}
}
- 创建EasyCharTextProducer.java
package org.jasig.cas.web;
import java.util.Random;
import nl.captcha.text.producer.TextProducer;
public class EasyCharTextProducer implements TextProducer {
// private static final char[] chars = { 'A', 'B', 'C', 'D', 'E',
// '6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
// '去','子','也','和','下','天', '6', '8', '3', '4',
// 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
// 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'a', 'b', 'c',
// '他','这','上','个','大','里', '6', '8', '3', '4',
// '6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
// 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n',
// 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
// 'y', '6', '8','3', '4', '7', '5', '你', '我', '他',
// '的','一','了','是','我','不','在','人','们','有','来',
// '6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
// '出','小','么','你','多','没','为','又','可'};
private static final char[] chars = { 'A', 'B', 'C', 'D', 'E',
'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
'6', '8', '3', '4', '5', '7', '3', '4', '6', '5',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'a', 'b', 'c',
'6', '8', '3', '4', '5', '7', '3', '4', '6', '5',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',
'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n',
'y', '6', '8', '3', '4', '7', '5', 'k', 'm', 'n',
'6', '8', '3', '4', '7', '5', '6', '8', '3', '4',};
private static final int lastChar = chars.length;
private int length;
public EasyCharTextProducer() {
this(5);
}
public EasyCharTextProducer(int length) {
super();
this.length = length;
}
public String getText() {
Random random = new Random();
StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i++) {
int r = random.nextInt(lastChar);
sb.append(chars[r]);
}
return sb.toString();
}
}
- 创建FixedWordRenderer.java
package org.jasig.cas.web;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import nl.captcha.text.renderer.WordRenderer;
public class FixedWordRenderer implements WordRenderer {
// The text will be rendered 25%/5% of the image height/width from the X and
// Y axes
private static final double YOFFSET = 0.20;
private static final double XOFFSET = 0.15;
private static final int charDistance = 5;
private static final Color DEFAULT_COLOR = Color.BLACK;
private static final List<Font> DEFAULT_FONTS = new ArrayList<Font>();
private final Color _color;
private final List<Font> _fonts;
static {
DEFAULT_FONTS.add(new Font("Arial", Font.BOLD, 40));
DEFAULT_FONTS.add(new Font("Courier", Font.BOLD, 40));
}
/**
* Will render the characters in black and in either 40pt Arial or Courier.
*/
public FixedWordRenderer() {
this(DEFAULT_COLOR, DEFAULT_FONTS);
}
public FixedWordRenderer(Color color, List<Font> fonts) {
_color = color != null ? color : DEFAULT_COLOR;
_fonts = fonts != null ? fonts : DEFAULT_FONTS;
}
/**
* Render a word onto a BufferedImage.
*
* @param word
* The word to be rendered.
* @param bi
* The BufferedImage onto which the word will be painted on to
*/
public void render(String word, BufferedImage image) {
Random random = new Random();
Graphics2D g = image.createGraphics();
RenderingHints hints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
hints.add(new RenderingHints(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY));
g.setRenderingHints(hints);
g.setColor(_color);
FontRenderContext frc = g.getFontRenderContext();
int startPosX = (int) Math.round(image.getWidth() * XOFFSET);
int startPosY = image.getHeight()
- (int) Math.round(image.getHeight() * YOFFSET);
char[] wc = word.toCharArray();
for (char element : wc) {
char[] itchar = new char[] { element };
int choiceFont = random.nextInt(_fonts.size());
Font itFont = _fonts.get(choiceFont);
g.setFont(itFont);
GlyphVector gv = itFont.createGlyphVector(frc, itchar);
double charWitdth = gv.getVisualBounds().getWidth();
g.drawChars(itchar, 0, itchar.length, startPosX, startPosY);
startPosX = startPosX + (int) charWitdth
+ random.nextInt(charDistance) - 2;
}
}
}
- 最终效果,鼠标点击验证码进行自动刷新