两种验证码

这里我写了两种验证码,一种是随机生成四位数,还有一种是中文字的数学题加减题,其实就是生成图片上有点不同,别的地方一样。

html代码

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <base href="<%=basePath%>">
    <link href="<%=request.getContextPath() %>/css/init.css" rel="stylesheet" type="text/css" />
    <link rel="stylesheet" type="text/css" href="<%=path%>/css/exam.css" />

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<script>
		function reloadImage(){
			document.getElementById('identy').src='ValidateImage?ts='+new Date().getTime();
		}

	</script>
  </head>

  <body>
<img src="ValidateImage" id="identy" onClick="reloadImage()"/>
<form action="getzyms.action">
<input type="submit" value="在后台打印验证码1"/>
</form>
  </body>
</html>

struts.xml代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="yzm" extends="struts-default">

	<result-types>
       <result-type name="ValidateImage" class="yzm.ImageResult" />
    </result-types>

    <action name="ValidateImage" class="yzm.ImageAction" method="doDefault">
       <result name="image" type="ValidateImage" />
    </action>

    <action name="getzyms" class="com.web.actoin.getyzm" method="getzyms">
    </action>
</package>
</struts>    

java代码

package com.web.actoin;

import org.apache.struts2.ServletActionContext;

public class getyzm {
	public void getzyms(){
		System.out.println(ServletActionContext.getRequest().getSession().getAttribute("CheckCodeImageAction").toString().toUpperCase());
	}
}
package yzm;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
public class ImageResult implements Result {
    public void execute(ActionInvocation ai) throws Exception {
       ImageAction action = (ImageAction)ai.getAction();
       HttpServletResponse response = ServletActionContext.getResponse();
       response.setHeader("Cash", "no cash");
       response.setContentType(action.getContentType());
       response.setContentLength(action.getContentLength());
       response.getOutputStream().write(action.getImageBytes());
       response.getOutputStream().flush();
    }
}

下面两个可以两选一(四位数字与加减)

package yzm;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Random;

import java.awt.*;

import java.awt.image.*;

import java.io.ByteArrayOutputStream;

import org.apache.struts2.ServletActionContext;

public class ImageAction extends ActionSupport {
	//

    private static final String SessionName = "CheckCodeImage";
    private static final Random rdm = new Random();

    private static final String[] china = new String[]{
    	"零","一","二","三","四","五","六","七","八","九"
    };
    private static final String[] fh = new String[]{
    	"加","减","乘"
    };

    public static Color getRandomColor(){
		return new Color(rdm.nextInt(255),rdm.nextInt(255),rdm.nextInt(255));
	}

	public static Color getReverseColor(Color c){
		return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
	}

    private static final Font font = new Font(Font.SANS_SERIF,Font.BOLD, 16);

    private String text = "";
    private byte[] bytes = null;
    private String contentType = "image/jpeg";
    public byte[] getImageBytes(){
       return this.bytes;
    }
    public String getContentType(){
       return this.contentType;
    }
    public void setContentType(String value){
       this.contentType = value;
    }
    public int getContentLength(){
       return bytes.length;
    }

    private void generateText(){
       String source = new String();
       int f=rdm.nextInt(ImageAction.china.length);
       int s=rdm.nextInt(ImageAction.china.length);
       int h=rdm.nextInt(ImageAction.fh.length);
       source=ImageAction.china[f]+ImageAction.fh[h]+ImageAction.china[s];
       int result=0;
       if(h==0)
    	   result=f+s;
       if(h==1)
    	   result=f-s;
       if(h==2)
    	   result=f*s;
       System.out.println("gettext:"+source);
       this.text = new String(source);
       // 锟斤拷锟斤拷Session
       ServletActionContext.getRequest().getSession().setAttribute(SessionName,result);
    }

    private BufferedImage createImage(){
       int width = 70;
       int height = 20;
       Color color=Color.BLACK;
		Color reverse=getReverseColor(color);
       BufferedImage image =
           new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		Graphics2D g=image.createGraphics();
		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));
		g.setColor(color);
		g.fillRect(0, 0, width, height);
		g.setColor(reverse);
		System.out.println("text:"+text);
		g.drawString(text, 15, 15);
		for(int i=0,n=rdm.nextInt(20);i<n;i++){
			g.drawRect(rdm.nextInt(width),rdm.nextInt(height),1,1);
		}
       g.dispose();
       return image;
    }
    private void generatorImageBytes(BufferedImage image){
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       try{
           javax.imageio.ImageIO.write(image, "jpg", bos);
           this.bytes = bos.toByteArray();
       }catch(Exception ex){
       }finally{
           try{
              bos.close();
           }catch(Exception ex1){
           }
       }
    }

    public String doDefault(){
       this.generateText();
       BufferedImage image = this.createImage();
       this.generatorImageBytes(image);
       System.out.println("_"+ServletActionContext.getRequest().getSession().getAttribute(SessionName));
       return "image";
    }
}

package yzm;
import com.opensymphony.xwork2.ActionSupport;

import java.util.Random;

import java.awt.*;

import java.awt.image.*;

import java.io.ByteArrayOutputStream;

import org.apache.struts2.ServletActionContext;

public class Images extends ActionSupport {
	//成生四位数字的图片
    /**
     * 锟斤拷证锟斤拷锟接︼拷锟絊ession锟斤拷
     */
    private static final String SessionName = "CheckCodeImageAction";
    private static final Random rdm = new Random();
    /**
     * 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷证锟斤拷锟斤拷锟斤拷源
     */
    private static final char[] source = new char[]{
    	'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M'
		,'N','P','Q','R','S','T','U','V','W','X','Y','Z'
    };
    /**
     * 锟斤拷锟斤拷锟斤拷锟斤拷印锟斤拷证锟斤拷锟斤拷址锟斤拷锟缴?
     */
    public static Color getRandomColor(){
		return new Color(rdm.nextInt(255),rdm.nextInt(255),rdm.nextInt(255));
	}

	public static Color getReverseColor(Color c){
		return new Color(255-c.getRed(),255-c.getGreen(),255-c.getBlue());
	}
    /**
     * 锟斤拷锟节达拷印锟斤拷证锟斤拷锟斤拷锟斤拷锟?
     */
    private static final Font font = new Font(Font.SANS_SERIF,Font.BOLD, 16);
    /**
     * 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟?
     */
    private String text = "";
    private byte[] bytes = null;
    private String contentType = "image/jpeg";
    public byte[] getImageBytes(){
       return this.bytes;
    }
    public String getContentType(){
       return this.contentType;
    }
    public void setContentType(String value){
       this.contentType = value;
    }
    public int getContentLength(){
       return bytes.length;
    }
    /**
     * 锟斤拷沙锟斤拷锟轿?锟斤拷锟斤拷锟斤拷址锟?
     * @return
     */
    private void generateText(){
       char[] source = new char[4];
       for(int i=0; i<source.length; i++){
           source[i] = Images.source[rdm.nextInt(Images.source.length)];
       }
       this.text = new String(source);
       // 锟斤拷锟斤拷Session
       ServletActionContext.getRequest().getSession().setAttribute(SessionName,this.text);
    }
    /**
     * 锟斤拷锟节达拷锟斤拷锟斤拷纱锟接★拷锟斤拷锟斤拷锟街凤拷锟酵计?
     * @return 锟斤拷锟节达拷锟叫达拷锟斤拷锟侥达拷印锟斤拷锟街凤拷锟酵计?
     */
    private BufferedImage createImage(){
       int width = 70;
       int height = 20;
       Color color=Color.BLACK;
		Color reverse=getReverseColor(color);
       BufferedImage image =
           new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

		Graphics2D g=image.createGraphics();
		g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));
		g.setColor(color);
		g.fillRect(0, 0, width, height);
		g.setColor(reverse);
		g.drawString(text, 15, 15);
		for(int i=0,n=rdm.nextInt(20);i<n;i++){
			g.drawRect(rdm.nextInt(width),rdm.nextInt(height),1,1);
		}
       g.dispose();
       return image;
    }
    /**
     * 锟斤拷锟酵计拷锟斤拷锟斤拷纸锟斤拷锟斤拷锟?
     * @param image 锟斤拷锟节达拷锟斤拷锟街斤拷锟斤拷锟斤拷锟酵计?
     */
    private void generatorImageBytes(BufferedImage image){
       ByteArrayOutputStream bos = new ByteArrayOutputStream();
       try{
           javax.imageio.ImageIO.write(image, "jpg", bos);
           this.bytes = bos.toByteArray();
       }catch(Exception ex){
       }finally{
           try{
              bos.close();
           }catch(Exception ex1){
           }
       }
    }
    /**
     * 锟斤拷struts2锟斤拷锟斤拷锟斤拷锟斤拷锟矫的凤拷锟斤拷
     * @return 锟斤拷远锟斤拷锟斤拷锟街凤拷"image"
     */
    public String doDefault(){
       this.generateText();
       BufferedImage image = this.createImage();
       this.generatorImageBytes(image);
       System.out.println("_"+ServletActionContext.getRequest().getSession().getAttribute(SessionName));
       return "image";
    }
}
时间: 2024-10-11 07:40:35

两种验证码的相关文章

android 截取验证码的两种实现方式

在进行手机验证码验证时,为了提升用户体验,实现自动截取验证填充的行式,实现这个功能有两种方法,分别是利用android的广播机制和android的ContentObserver 实现. 第一种的实现方法如下: /**  * 监听返回的验证码信息,并自动补充如验证码输入框中 [一级方法]  */ public BroadcastReceiver getMessageReceive = new BroadcastReceiver() {  String address; @Override  pub

获取验证码显示的两种简单实现,交互绝非偶然~

前面为大家讲过计时器的顺时针的两种方法,在录制视频等操作中颇有使用,今天就给大家带来倒计时实现的两种方式. 对面前面的正向计时方法没有了解的,可以直接传送门:http://www.cnblogs.com/liushilin/p/5802954.html 虽然最近写的都比较简单和基础,不过简单不代表熟悉,基础不代表就会,大牛绕过,哈,中牛小牛也可以绕过,这个是写给初学者的. 先搞个效果图. 代码实现方式也超级简单啦,这里首推第一种实现方式,而且也是比较适合大家的,就是通过直接继承CountDown

Python随机生成验证码的两种方法

Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法方法一:利用range Python随机生成验证码的方法有很多,今天给大家列举两种,大家也可以在这个基础上进行改造,设计出适合自己的验证码方法 方法一: 利用range方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # -*- coding: utf-8 -*- import random def generate_verification_c

基于django实现图文验证码两种方式

引言:无论做什么项目用户模块永远绕不开的坎,而用户模块貌似一定是有验证码的,这里介绍python下两种实现验证码的方式 环境介绍:django+python3.6以上版本 方式1:使用django自带的django-simple-captcha 第三方包的下载 pip install django-simple-captcha 将captcha安装到 install_apps里面 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib

php两种按键处理事件

初学PHP,菜鸟一个,记录下学习过程遇到的问题.. 点击按钮事件处理办法 一个form表单里两个按钮,一个处理form中的action事件,另一个则处理另珍上php事件 1.事例代码: <html> <head> <meta http-equiv="Content-Type"content="text/html; charset=utf-8"> <script type="text/javascript"

vertical-align两种应用场合

vertical-align两种应用场合 (1)用在td/th中或display:table-cell元素中:让当前元素中的文本内容在竖直方向上居中    css部分:    .content{        display: table-cell;        width: 300px;        height: 100px;        border: 1px solid #aaa;        text-align: center;        /*line-height: 1

(七)android开发中两种方式监听短信的原理和实现

一.监听短信的两种方式的简介 Android程序开发中,有两种方式监听短信内容:一.接收系统的短信广播:二.应用观察者模式,监听短信数据库. 第一种方式接收系统的短信广播: A.这种方式只对新收到的短消息有效,运行代码,并不会读取收件箱中已读或未读的消息,只有当收到新来的短消息时,才会执行onReceive()方法. B.并且这个广播是有序广播,如果当别的程序先读取到了这个广播,然后拦截掉了个这个广播,你将接收不到.当然我们可以通过设置priority的数值,其实有时是不管用的,现在在一些定制的

百度贴吧无限自动水贴的两种方式,使用requests(urllib2)和selenium两种方式回帖

本文介绍,回复贴吧指定某楼层主的帖子的方法.在这里不介绍无限发主贴和无限回复主贴的方法,无限发主题帖会爆吧,引起别人的反感,并且很容易遭到吧主的封杀:无限回主题帖,会让整个帖子的每楼的回复充满了自己的内容,影响别人阅读也会遭人反感.只要看了本文就可以无限回帖了,如果非要改成发主题帖或者回主题帖,那肯定只会比这简单,自己理解修改下就可以了. 一般向系统里面添加数据,无非就几种手段,普通人最常用的是用浏览器或者app手动发帖回帖. 第二种是使用类似qtp  selenium之类的自动化测试工具,自动

总结 XSS 与 CSRF 两种跨站攻击

在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了.但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们.由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心.如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义.所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”.但最近又听说了另一种跨站攻击 CS