`

simpeCaptha验证码并自己附加加减运算

 
阅读更多
这个是验证码的开源框架 。
首先import SimpleCaptha  jar .

然后web.xml

引用
<servlet>    
       <servlet-name>StickyCaptcha</servlet-name>    
       <servlet-class>nl.captcha.servlet.SimpleCaptchaServlet</servlet-class>    
        <init-param>    
          <param-name>width</param-name>    
           <param-value>150</param-value>    
        </init-param>    
        <init-param>    
           <param-name>height</param-name>    
            <param-value>35</param-value>    
        </init-param>    
       <init-param>  
         <param-name>text</param-name>  
         <param-value>word:3,number:3</param-value>  
    </init-param>  
   </servlet>    
    <servlet-mapping>     
        <servlet-name>StickyCaptcha</servlet-name>    
      <url-pattern>/stickyImg</url-pattern>    
   </servlet-mapping> 
 


index.jsp

引用
<img src="/Validation/stickyImg" />  

    <form action="/Validation/captchaSubmit.jsp" method="post">    
        <input name="answer" />    
        <input type="submit" name="submit"/>    
</form> 
Validation工程名

然后验证。。。
captchaSubmit.jsp

引用
<%@ page import="nl.captcha.Captcha" %>    
   <%    
   nl.captcha.Captcha captcha = (nl.captcha.Captcha) session.getAttribute(Captcha.NAME);    
  request.setCharacterEncoding("UTF-8");    
    String answer = request.getParameter("answer");    
   if (captcha.isCorrect(answer)) { %>    
       <b>Correct!</b>    
<% } %>  



如果想扩展和详细了解,可以反编译jar看或者。
http://www.iteye.com/topic/790024
http://xiayingjie.iteye.com/blog/790038


如果想可以用加减简单运算验证。则可以扩展这个核心类。

package util;
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.backgrounds.GradiatedBackgroundProducer;
import nl.captcha.gimpy.BlockGimpyRenderer;
import nl.captcha.servlet.CaptchaServletUtil;
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 CalculateCaptcha 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";// 文本

	private static final String PAEAM_CAL = "calculate";// 算数
	
	protected int _width = 200;
	protected int _height = 50;
	protected boolean _noise = false;
	protected String _text = null;
	protected String _cal = "0";

	@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 = String.valueOf(getInitParameter(PAEAM_TEXT));
		}
		if (getInitParameter(PAEAM_CAL) != null) {
			_cal = String.valueOf(getInitParameter(PAEAM_CAL));
		}
	}

	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		OcjCaptcha.Builder builder = new OcjCaptcha.Builder(_width, _height);
		// 增加边框
		builder.addBorder();
		// 是否增加干扰线条
		if (_noise == true)
			builder.addNoise();
		// ----------------自定义字体大小-----------
		// 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
		List<Font> fontList = new ArrayList<Font>();
		fontList.add(new Font("Courier", Font.BOLD, 40));
		DefaultWordRenderer dwr = new DefaultWordRenderer(Color.green, fontList);
		WordRenderer wr = dwr;
		// 增加文本,默认为5个随机字符.
		if ("1".equals(_cal)) {
			char[] numbers = new char[] {'0','1', '2', '3', '4', '5', '6','7', '8' };
			builder.addText(new DefaultTextProducer(1,numbers), wr);
			char[] operators = new char[] {'+','-'};
			builder.addText(new DefaultTextProducer(1,operators), wr);
			builder.addText(new DefaultTextProducer(1,numbers), wr);
		}else if (_text != null){
			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[] {'0','1', '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);
				}
			}

		}else{
			builder.addText();
		}

		// 设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
		GradiatedBackgroundProducer gbp = new GradiatedBackgroundProducer();
		gbp.setFromColor(Color.yellow);
		gbp.setToColor(Color.red);
		// 无渐进效果,只是填充背景颜色
		builder.addBackground(gbp);
		builder.gimp(new BlockGimpyRenderer(1));
		OcjCaptcha captcha = builder.build();
		CaptchaServletUtil.writeImage(resp, captcha.getImage());
		//如果算数支持.
		if("1".equals(_cal)){
			String anstr=captcha.getAnswer();
			String oper=anstr.indexOf('+')!=-1?"+":"-";
			String anstrs[]=anstr.split(oper);
			Integer result =0;
			switch(oper){
			case "+":
				result=Integer.parseInt(anstrs[0])+Integer.parseInt(anstrs[1]);
				break;
			case "-":
				result=Integer.parseInt(anstrs[0])-Integer.parseInt(anstrs[1]);
				break;
			}
			captcha.setAnswer(String.valueOf(result));
		}
		req.getSession().setAttribute(OcjCaptcha.NAME, captcha);
	}

}



配置文件web.xml
引用
<servlet>    
       <servlet-name>StickyCaptcha</servlet-name>    
       <servlet-class>util.CalculateCaptcha</servlet-class>    
        <init-param>    
          <param-name>width</param-name>    
           <param-value>100</param-value>    
        </init-param>    
        <init-param>    
           <param-name>height</param-name>    
            <param-value>35</param-value>    
        </init-param>    
       <init-param>  
         <param-name>text</param-name>  
         <param-value>word:0,number:0</param-value>  
       </init-param>  
        <init-param>    
           <param-name>calculate</param-name>    
            <param-value>1</param-value>    
        </init-param>  
   </servlet>    
    <servlet-mapping>     
        <servlet-name>StickyCaptcha</servlet-name>    
      <url-pattern>/stickyImg</url-pattern>    
   </servlet-mapping>   


OcjCaptcha 为Captcha加了个

public void setAnswer(String answer) {
		this._builder._answer = answer;
	}


如果页面需要无提交页面就刷新验证码的话,可以使用更改src的方式来实现。不能用ajax实现。
分享到:
评论

相关推荐

    线性表设计100位以内的长整数加减运算的程序

    "线性表设计100位以内的长整数加减运算的程序" 知识点一:链表的基本结构和操作方法 在设计一个100位以内的长整数加减运算的程序时,使用链表来表示长整数是一个不错的选择。链表的基本结构包括节点和指针,节点中...

    加减运算器.docx

    加减运算电路的设计思路是基于基本加减运算电路和附加门电路的组合,通过改变 M0、M1 和 Cin 的值,可以实现传送、加减、加 1、减 1 等多种功能。 FLAG 位包括 SF 符号标志、ZF 零标志、OF 溢出标志和 CF 进位标志,...

    能够实现逻辑运算(逻辑非、逻辑加、逻辑乘、逻辑异)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算

    能够实现逻辑运算(逻辑非、逻辑加、逻辑乘、逻辑异)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算。

    计算机组成原理之补码加减运算器

    在探讨计算机组成原理时,补码加减运算器是一个不可忽视的重要组成部分。它不仅涉及基本的加法器原理,还包括了补码加减运算和无符号数的加减运算,这些知识是构建计算机数字电路设计的基础。在这篇文章中,我们将...

    汇编加减运算

    用于汇编语言中的加法和减法。通过减法可以得到正负值,及绝对值。

    一年级100以内加减混合运算口算题

    6. 加减混合运算口算题的类型:加减混合运算口算题可以分为不同的类型,例如加减混合运算口算题、加减混合运算口算题、加减混合运算口算题等等。 7. 一年级加减混合运算口算题的练习方法:一年级学生学习加减混合...

    小学加减乘除运算测试

    《小学加减乘除运算测试》是一个基于JavaScript开发的在线教育工具,主要针对小学生进行数学基础知识的练习,尤其是加减乘除的运算。这个应用程序旨在通过互动的方式帮助孩子们巩固数学运算技能,提升学习兴趣。 ...

    大整数加减乘除运算

    本项目主要关注大整数的加减乘除运算的实现,这涉及到数据结构和算法的设计。以下是对这个课程设计项目的详细解读。 首先,我们要理解大整数的概念。在常规的计算机编程中,整数的大小受到数据类型限制,例如,int...

    新人教七年级数学有理数的加减乘除乘方混合运算PPT课件.pptx

    新人教七年级数学有理数的加减乘除乘方混合运算PPT课件 以下是关于新人教七年级数学有理数的加减乘除乘方混合运算PPT课件的详细知识点: 一、有理数的混合运算顺序 在进行有理数的混合运算时,需要遵守一定的顺序...

    组成原理课程设计::功能:实现逻辑运算(逻辑非,逻辑加。。)定点整数的单符号位补码加减法,定点整数的原码一位乘法,浮点数的加减运算

    在加减运算中,需要对齐尾数的小数点,处理阶码的差异,并考虑下溢(underflow)和上溢(overflow)。下溢发生在两个非常接近的负数相加得到一个较小的负数,但超出了可表示的最小值;上溢则发生在两个较大数值相加...

    实现任意大整数的加减运算

    实现任意大整数的加减运算! input(&num1, &num2); num3= sum(&num1, &num2); output(&num1); if(num2.flag==0) printf("%c", '+'); else printf("%c", '-'); output(&num2); printf("= "); if(num3....

    (完整版)有理数混合运算的整式的加减运算过关题.pdf

    这些题目涵盖了多个数学知识点,主要涉及有理数的混合运算和整式的加减运算,以及代数式的化简和求值。以下是对这些知识点的详细解释: 1. **有理数混合运算**:包括加、减、乘、除以及括号的使用。例如题目中的...

    java实现10以内的加减乘验证码

    本项目“java实现10以内的加减乘验证码”是一个基于MyEclipse的Web应用,设计用于生成包含10以内数字的加减乘算术问题作为验证码。这样的验证码增加了破解的难度,因为机器人需要解决数学问题,而不仅仅是识别图像。...

    基于c51单片机简单的计算器程序,简易计算器设计两位数加减运算

    3. **运算逻辑**:实现基本的加减乘除运算,对于加减法,可以逐位进行;乘法和除法则需要更复杂的算法,例如二进制移位和逐位相加/减。 4. **显示驱动**:将运算结果显示在数码管上,需要配置P0、P1等端口作为数码管...

    初中数学数学论文从“有理数加减运算”谈中小学计算教学的衔接

    学生在小学时期已经熟悉了整数的加减运算,并理解了正负数的基本概念。进入初中后,有理数的加减法对小学知识进行了延伸。这一阶段,学生不仅要学习有理数的概念,还要掌握正负数的加减。正负数的加减法是对小学数学...

    以内加减运算能力的发展与教育PPT学习教案.pptx

    4岁以前的幼儿一般还不能进行加减运算,4岁后开始借助动作操作实物,5岁后能用表象进行运算,5岁半以后,幼儿开始理解和运用数的组成,并能解决更复杂的加减问题。 幼儿学习加减运算的特点包括:减法相对于加法更难...

    秋七上数学整式的加减运算教学PPT教案学习.pptx

    在中学数学教育中,整式的加减运算是数学教学的基础...通过“秋七上数学整式的加减运算教学PPT教案”的学习,学生能够在教师的指导下,逐步深入理解和掌握整式加减运算,从而提高自己的运算能力和解决实际问题的能力。

    带加减法的验证码+例子

    在本示例中,我们探讨的是一个特别设计的验证码,它结合了基本的加减法运算,增加了破解的难度,因为自动化程序需要能够理解并执行这些计算。 验证码的核心在于其随机性,确保每次请求时都会生成不同的验证码。在这...

Global site tag (gtag.js) - Google Analytics