Java利用captcha实验图片验证码
下载jar包patchca-0.5.0.jar
引入到项目中
获取验证码图片类
package com.wamei.controller.jcaptcha;
import org.apache.log4j.Logger;
import org.patchca.color.ColorFactory;
import org.patchca.filter.predefined.*;
import org.patchca.service.ConfigurableCaptchaService;
import org.patchca.utils.encoder.EncoderHelper;
import org.patchca.word.RandomWordFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.io.IOException;
import java.util.Random;
/**
* Created by qixuan.chen on 2017/5/18.
*/
@Controller
@RequestMapping("/captcha")
public class JcaptchaImageCreater {
private final static Logger logger = Logger.getLogger(JcaptchaImageCreater.class);
private static ConfigurableCaptchaService cs = new ConfigurableCaptchaService();
private static Random random = new Random();
static {
// cs.setColorFactory(new SingleColorFactory(new Color(25, 60, 170)));
cs.setColorFactory(new ColorFactory() {
@Override
public Color getColor(int x) {
int[] c = new int[3];
int i = random.nextInt(c.length);
for (int fi = 0; fi < c.length; fi++) {
if (fi == i) {
c[fi] = random.nextInt(71);
} else {
c[fi] = random.nextInt(256);
}
}
return new Color(c[0], c[1], c[2]);
}
});
RandomWordFactory wf = new RandomWordFactory();
wf.setCharacters("23456789abcdefghigkmnpqrstuvwxyzABCDEFGHIGKLMNPQRSTUVWXYZ");
wf.setMaxLength(4);
wf.setMinLength(4);
cs.setWordFactory(wf);
}
@RequestMapping("/pcrimg")
public void crimg(HttpServletRequest request, HttpServletResponse response) throws IOException {
Integer number = ServletRequestUtils.getIntParameter(request, "number", 4);
Integer width = ServletRequestUtils.getIntParameter(request, "width", 200);
Integer height = ServletRequestUtils.getIntParameter(request, "height", 60);
cs.setHeight(height);
cs.setWidth(width);
RandomWordFactory rwf = new RandomWordFactory();
rwf.setMinLength(number);
rwf.setMaxLength(number);
cs.setWordFactory(rwf);
switch (random.nextInt(5)) {
case 0:
cs.setFilterFactory(new CurvesRippleFilterFactory(cs.getColorFactory()));
break;
case 1:
cs.setFilterFactory(new MarbleRippleFilterFactory());
break;
case 2:
cs.setFilterFactory(new DoubleRippleFilterFactory());
break;
case 3:
cs.setFilterFactory(new WobbleRippleFilterFactory());
break;
case 4:
cs.setFilterFactory(new DiffuseRippleFilterFactory());
break;
}
HttpSession session = request.getSession(false);
if (session == null) {
session = request.getSession();
}
setResponseHeaders(response);
String token = EncoderHelper.getChallangeAndWriteImage(cs, "png", response.getOutputStream());
session.setAttribute("captchaToken", token);
logger.info("当前的SessionID=" + session.getId() + ",验证码=" + token);
}
protected void setResponseHeaders(HttpServletResponse response) {
response.setContentType("image/png");
response.setHeader("Cache-Control", "no-cache, no-store");
response.setHeader("Pragma", "no-cache");
long time = System.currentTimeMillis();
response.setDateHeader("Last-Modified", time);
response.setDateHeader("Date", time);
response.setDateHeader("Expires", time);
}
}
页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html class="login-bg">
<head>
<title>登录</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- bootstrap -->
<link href="../css/bootstrap/bootstrap.css" rel="stylesheet" />
<link href="../css/bootstrap/bootstrap-responsive.css" rel="stylesheet" />
<link href="../css/bootstrap/bootstrap-overrides.css" type="text/css" rel="stylesheet" />
<!-- global styles -->
<link rel="stylesheet" type="text/css" href="../css/layout.css" />
<link rel="stylesheet" type="text/css" href="../css/elements.css" />
<link rel="stylesheet" type="text/css" href="../css/icons.css" />
<!-- libraries -->
<link rel="stylesheet" type="text/css" href="../css/lib/font-awesome.css" />
<!-- this page specific styles -->
<link rel="stylesheet" href="../css/compiled/signin.css" type="text/css" media="screen" />
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<style type="text/css">
body{
background:url(../img/bgs/landscape.jpg);
filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale')";
-moz-background-size:100% 100%;
background-size:100% 100%;
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<div class="row-fluid login-wrapper">
<a href="index.jsp">
<img class="logo" src="../img/logo.png" />
</a>
<div class="span4 box">
<div class="content-wrap">
<h6>用户登录</h6>
<input class="span12" type="text" placeholder="登录名/邮箱" id="loginId" value=""/>
<input class="span12" type="password" placeholder="请输入您的密码" id="password" value=""/>
<input class="span12" type="text" placeholder="请输入验证码" id="validateCode" value=""/>
<img id="valiImg" src="/wamei/captcha/pcrimg.htm?width=200&height=50" οnclick="changeValiImg(this);" style="margin-left: -21px;" />
<a οnclick="changeValiImg(this);">看不清,换一张!</a>
<!-- 忘记密码 <a href="forgetPwd.jsp" class="forgot">忘记密码?</a> -->
<div class="remember">
<!--
<input id="remember-me" type="checkbox" />
<label for="remember-me">记住我</label>
-->
</div>
<a class="btn-glow primary login" href="javascript:void(0);" οnclick="login()">登录</a>
</div>
</div>
<div class="span4 no-account">
<!--
<p>还没有帐号?</p>
<a href="register.jsp">马上注册</a> -->
</div>
</div>
<!-- scripts -->
<script src="../js/jquery.min.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/theme.js"></script>
<!-- pre load bg imgs -->
<script type="text/javascript">
$(function () {
// 判断是否跳到iframe中打开登录页面
var parentIframe = $('#mainFrame', parent.document);
if(parentIframe && parentIframe.attr("src")){
parent.window.location.href = "login.jsp";
}
// bg switcher
var $btns = $(".bg-switch .bg");
$btns.click(function (e) {
e.preventDefault();
$btns.removeClass("active");
$(this).addClass("active");
var bg = $(this).data("img");
$("html").css("background-image", "url('../img/bgs/" + bg + "')");
});
$(".content-wrap input").keydown(function (e) {
if (e.keyCode == 13)
{
login();
}
});
});
function login(){
var loginId = $("#loginId").val();
var pwd = $("#password").val();
var valiCode = $("#validateCode").val();
if(!loginId || !pwd ){
alert("请输入登录信息");
return false;
}
$.ajax({
url:"/wamei/loginController/login.htm",
data: {"loginId":loginId,"password":pwd,"validateCode":valiCode},
async:false,
success: function($data){
var data = eval("("+$data+")");
if(data.statusCode == 1){
window.location.href = "../index.jsp";
}else{
alert(data.msg);
}
}
});
}
function changeValiImg(obj){
var srcurl = $("#valiImg").attr("src");
$('#valiImg').attr('src',srcurl +'&d='+new Date().getTime());
}
</script>
</body>
</html>
效果: