Java利用captcha实验图片验证码

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>

效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值