java-captcha实现验证码(二)

captcha实现验证码验证用户登录,防止密码被暴力破解。

下面是在Springmvc框架中运行。

导入的jar包:

kaptcha-2.3.2.jar

下载地址:http://download.csdn.net/detail/u013147600/9052871

或是在maven ---pom.xml:配置如下

<!-- 验证码工具 -->

<dependency>

<groupId>com.google.code</groupId>

<artifactId>kaptcha</artifactId>

<version>2.3.2</version>

</dependency>

Web.xml的配置

<span style="font-size:14px;"><!-- 验证码Servlet -->
 	<servlet>
 		<servlet-name>kaptcha</servlet-name>
 		<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
 	</servlet>
  	<servlet-mapping>
  		<servlet-name>kaptcha</servlet-name>
  		<url-pattern>/kaptcha.jpg</url-pattern>
  	</servlet-mapping></span>

springmvc.xml 配置

(captchaProducer相当于一个类,用户而已根据自己的要求对其属性进行修改)

<span style="font-size:14px;">	<!-- captcha一些属性的配置 -->
	<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
        <property name="config">
            <bean class="com.google.code.kaptcha.util.Config">
                <constructor-arg>
                    <props>
                        <prop key="kaptcha.border">yes</prop>
                        <prop key="kaptcha.border.color">105,179,90</prop>
                        <prop key="kaptcha.textproducer.font.color">blue</prop>
                        <prop key="kaptcha.image.width">125</prop>
                        <prop key="kaptcha.image.height">45</prop>
                        <prop key="kaptcha.textproducer.font.size">45</prop>
                        <prop key="kaptcha.session.key">code</prop>
                        <prop key="kaptcha.textproducer.char.length">4</prop>
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>
                    </props>
                </constructor-arg>
            </bean>
        </property>
    </bean></span>

SpringUtils.java 解析类

(用于解析springmvc.xml中的bean)

<span style="font-size:14px;">package com.authc.utils;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author lyx
 *
 * 2015-8-18下午3:53:19
 *
 *com.utils.SpringUtil
 *	TODO
 */
public class SpringUtil {

	private static ApplicationContext ctx =new ClassPathXmlApplicationContext("springmvc.xml");

	public static Object getBean(String beanId)
	{
		return ctx.getBean(beanId);
	}
}
</span>

UserController控制层类

<span style="font-size:14px;">@Controller
@RequestMapping("/member")
public class UserController {

    private Producer captchaProducer; 

    @RequestMapping(value = "captcha-image")
    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession(); 

        //获取springmvc.xml中的captchaProducer Bean
        captchaProducer = (Producer) SpringUtil.getBean("captchaProducer");  

        String code = (String)session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        System.out.println("系统生成的验证码: " + code );  

        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        response.setContentType("image/jpeg");  

        String capText = captchaProducer.createText();
        //将系统生成的验证码放入Session中
        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);  

        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(bi, "jpg", out);
        try {
            out.flush();
        } finally {
            out.close();
        }
        return null;
    }  

    @RequestMapping("/checkCode")
	public String checkCode(HttpServletRequest request)
	{
		//获取用户输入的验证码
		String submitCode = WebUtils.getCleanParam(request,"j_code");

		//从session中获取系统生成的验证码
		String kaptchaExpected = (String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); 

		System.out.println("用户输入的验证码是:"+submitCode+",系统生成的验证码:"+kaptchaExpected);
		//进行比较
		if(StringUtils.isEmpty(submitCode) || StringUtils.equalsIgnoreCase(submitCode, kaptchaExpected))
		{

			request.setAttribute("checkCode","验证码正确!");
		}else
		{
			request.setAttribute("checkCode","验证码错误!");
		}
		return "/kaptcha";
	}

}

	</span>

注:这里是在Controller中进行验证,比较合适的方法应该是在js里面对用户输入的验证码进行验证

kaptcha.jsp页面

<span style="font-size:14px;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page isELIgnored="false"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>验证码</title>

  <script type="text/javascript" src="<%=request.getContextPath()%>/res/js/jquery-1.11.3.min.js">
  </script></head>

  <body>
    <script type="text/javascript">
$(function(){  //生成验证码
    $('#kaptchaImage').click(function () {
    $(this).hide().attr('src', '<%=path%>/member/captcha-image?' + Math.floor(Math.random()*100) ).fadeIn(); });
});   

window.onbeforeunload = function(){
    //关闭窗口时自动退出
    if(event.clientX>360&&event.clientY<0||event.altKey){
        alert(parent.document.location);
    }
};  

function changeCode() {  //刷新
    $('#kaptchaImage').hide().attr('src', '<%=path%>/member/captcha-image?' + Math.floor(Math.random()*100) ).fadeIn();
    event.cancelBubble=true;
}
</script> 

<div class="form-group">
   <label>验证码 </label>
   <form action="<%=path%>/member/checkCode">
   <input name="j_code" type="text" id="kaptcha" maxlength="4" class="form-control" />
   <br/>
   <img src="<%=path%>/member/captcha-image" id="kaptchaImage"  style="margin-bottom: -3px"/>
   <a href="#" onclick="changeCode()">看不清?换一张</a>
   	<input type="submit" value="验证">

   	<span>${checkCode }</span>
   </form>
</div>
  </body>
</html>
</span>

kaptcha可配置项:

kaptcha.border  是否有边框  默认为true  我们可以自己设置yes,no
kaptcha.border.color   边框颜色   默认为Color.BLACK
kaptcha.border.thickness  边框粗细度  默认为1
kaptcha.producer.impl   验证码生成器  默认为DefaultKaptcha
kaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreator
kaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwx
kaptcha.textproducer.char.length   验证码文本字符长度  默认为5
kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
kaptcha.textproducer.font.size   验证码文本字符大小  默认为40
kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACK
kaptcha.textproducer.char.space  验证码文本字符间距  默认为2
kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoise
kaptcha.noise.color   验证码噪点颜色   默认为Color.BLACK
kaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipple
kaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRenderer
kaptcha.background.impl   验证码背景生成器   默认为DefaultBackground
kaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAY
kaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITE
kaptcha.image.width   验证码图片宽度  默认为200
kaptcha.image.height  验证码图片高度  默认为50

简单的效果图:

参考:http://blog.csdn.net/rambo_china/article/details/7720181

http://cuisuqiang.iteye.com/blog/2048428

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 05:49:47

java-captcha实现验证码(二)的相关文章

Java中使用验证码和二维码

资源 需要:   jelly-core-1.7.0.GA.jar 网站:   http://lychie.github.io/products.html 将下载下来的 jelly-core-1.7.0.GA.jar 丢到项目里,不需要编写任何 java 代码,只需要在项目的 web.xml 文件中配置相关信息即可. 验证码 基于 Servlet 实现,在 web.xml 中配置即可使用.并支持自定义样式,常用的配置项见下表: 属性名称 属性描述 默认值 可选值 border 边框 no no,y

基于Java的Arc Engine二次开发的环境的配置

1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS for Desktop 10.2的安装 软件的下载:ArcGIS for Desktop 10.3全套的下载:http://pan.baidu.com/s/1o7F4yue,附带破解方法 本文使用的是10.2,其下载路径与安装破解方法如:http://jingyan.baidu.com/article/

Java提高篇(三六)-----java集合细节(二):asList的缺陷

在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷: 一.避免使用基本数据类型数组转换为列表 使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷.先看如下程序: public static void main(String[] args) { int[] ints = {1,2,3,4,5}; List list = Arrays.asList(ints); System.out.println("list'size:&

java linux ImageIO 验证码在一段时间以后出不来 问题总结

最近在测试上布署的项目经常性的出现验证码过了一段时间以后出不来的情况,耐心找了一下,最后在上级的指导下发现了报错,其实说真的,我自己也找到了这个报错,只是没有当一回事.因为这个验证码的东西不是我写的,我也不知道这个报错是不是和它有关系. 错误如下: 2014-05-21 10:46:17,826 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request org.springfram

Java入门——多线程(二)

Java入门——多线程(二) 线程的状态 要想实现多线程,必须在主线程中创建新的线程对象.任何线程一般具有5种状态. 创建状态:用构造方法创建一个线程对象之后,新的线程就处于该状态.已经有了相应的内存空间和其他资源和其他资源. 就绪状态:线程进入线程队列排队,等待CPU服务. 运行状态:CPU处理,自动调用run()方法. 阻塞状态:就是在执行过程中暂时挂起.原因有:人为挂起,CPU的决定,sleep(),suspend(),wait()等方法.只有当引起阻塞的原因被消除后,线程才能转入就绪状态

JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中,也是能看到他的,所以还是非常值得去学习的一个知识点的,我们直接开车了 一.Map概述 泛型< k,v> 键值对,映射关系 基本特点 该集合存储键值对,是一对一对往里存,而且要保证键的唯一性 1.添加 put(key ,values) putAll() 2.删除 clear() remove(ob

Java Web学习(二) Eclipse的配置

Java Web学习(二) Eclipse的配置 一.下载Eclipse 1.进入Eclipse官网,进行下载 上图,下载Eclipse IDE for JaveEE Developers 版本,然后根据windows系统32位或64位,进行选择(建议64位).如果你的机器内存过小,可以选择Eclipse的旧版本:Eclipse Indigo .Eclipse Juno . Eclipse Kepler 等版本. 2.解压缩安装 打开压缩包,将里面的Eclipse 拖出到指定位置,进行解压缩.

java学习之数组(二)

学编程吧java数组学习(二)发布了,欢迎大家通过xuebiancheng8.com来访问. 下面接着来分析数组,前面分析了什么是数组,为什么要用数组,下面来分析下如何使用数组 数组和其他数据类型一样,使用前要先定义.如下 int a[];这样就声明了一个数组 a = new int[10];然后为这个数组申请10个大小的空间 a[0] = 1; a[1] = 2; ....等等来为数组 赋值,为数组赋值完成后就可以通过下标来访问数组 当然数组在定义的时候也可以讲上面操作合并即 int a []

Java并发学习之二——获取和设置线程信息

本文是学习网络上的文章时的总结,感谢大家无私的分享. Thread类的对象中保存了一些属性信息能够帮助我们辨别每一个线程,知道它的一些信息 ID:每个线程的独特标示: Name:线程的名称: Priority:线程对象的优先级.优先级别在1-10之间,1是最低级,10是最高级. Status:线程状态.在java中,线程只有6种状态:new,runnable,blocked,waiting,time waiting 或terminated. 现在写一个程序,将线程的信息保存到文件中方便查看 pa

【Java面向对象基础(二)】细说String、StringBuffer和StringBuilder

[喵"的Android之路][基础篇(二)][Java面向对象基础]细说String.StringBuffer和StringBuilder 1.String String是Java中的一个final类,主要用于字符串的处理. 1.1 不可变性 String内的字符串是不可变的,每一次修改都会重新生成一个新的String对象实例. 例: 1 // 在堆中会创建一个"Hello"字符串实例,把地址赋给对象a 2 String a = new String("Hello&