Java实现Web页面前数字字母验证码实现

最近公司做项目开发中用到了验证码实现功能,将实现代码分享出来,

前段页面实现代码:

<ul>
   <li><label>验证码:</label></li>
   <li>
    <div>
    <input  type="text" name="validateCode"  class="login_input" value=""/>
    <img  id="img" src="${baseURL }/validateCode" onclick="onclickValidateCode(this);" />
    </div>
    </li>
</ul>

为了表达清晰,样式部分代码去掉了,大家根据自己的需求,自己添加样式。

页面JS代码:触发变动验证码改变的JS

<script type="text/javascript" language="javascript">
   
   //请求获取验证码
   function onclickValidateCode(obj){
	   $(obj).attr("src","${baseURL }/validateCode?"+new Date().getTime());
   }

</script>

后台 Controller处理:

package com.njcc.pay.controller.login;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.alibaba.dubbo.common.utils.StringUtils;

/**
 * 验证马  Controller
 * 
 * @author Administrator
 *
 */
@Controller
public class ValidateCodeController {

	@SuppressWarnings("unused")
	private static final Log LOG = LogFactory.getLog(ValidateCodeController.class);

    public static final String VALIDATE_CODE = "validateCode";
	private int w = 70;
	private int h = 23;

	/**
	 * @throws Exception 
	 * 函数功能说明 : 进入后台登陆页面.
	 * 
	 * @参数: @return
	 * @return String
	 * @throws
	 */
	@RequestMapping(value = "/validateCode")
	public void validateCode(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		createImage(request,response);
	}

	private void createImage(HttpServletRequest request,HttpServletResponse response) throws IOException {
		response.setHeader("Pragma", "no-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		response.setContentType("image/jpeg");

		String width = request.getParameter("width");
		String height = request.getParameter("height");
		if (StringUtils.isNumeric(width) && StringUtils.isNumeric(height)) {
			w = NumberUtils.toInt(width);
			h = NumberUtils.toInt(height);
		}

		BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();

		/*
		 * 生成背景
		 */
		createBackground(g);

		/*
		 * 生成字符
		 */
		String s = createCharacter(g);
		request.getSession().setAttribute(VALIDATE_CODE, s);

		g.dispose();
		OutputStream out = response.getOutputStream();
		ImageIO.write(image, "JPEG", out);
		out.close();

	}
	/**
	 * 生成颜色
	 * @param fc
	 * @param bc
	 * @return
	 */
	private Color getRandColor(int fc,int bc) { 
		int f = fc;
		int b = bc;
		Random random=new Random();
        if(f>255) {
        	f=255; 
        }
        if(b>255) {
        	b=255; 
        }
        return new Color(f+random.nextInt(b-f),f+random.nextInt(b-f),f+random.nextInt(b-f)); 
	}

	/**
	 * 生成背景
	 * @param g
	 */
	private void createBackground(Graphics g) {
		// 填充背景
		g.setColor(getRandColor(220,250)); 
		g.fillRect(0, 0, w, h);
		// 加入干扰线条
		for (int i = 0; i < 8; i++) {
			g.setColor(getRandColor(40,150));
			Random random = new Random();
			int x = random.nextInt(w);
			int y = random.nextInt(h);
			int x1 = random.nextInt(w);
			int y1 = random.nextInt(h);
			g.drawLine(x, y, x1, y1);
		}
	}

	/**
	 * 生成字符
	 * @param g
	 * @return
	 */
	private String createCharacter(Graphics g) {
		char[] codeSeq = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘J‘,
				‘K‘, ‘M‘, ‘N‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘,
				‘X‘, ‘Y‘, ‘Z‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘ };
		String[] fontTypes = {"Arial","Arial Black","AvantGarde Bk BT","Calibri"}; 
		Random random = new Random();
		StringBuilder s = new StringBuilder();
		for (int i = 0; i < 4; i++) {
			String r = String.valueOf(codeSeq[random.nextInt(codeSeq.length)]);//random.nextInt(10));
			g.setColor(new Color(50 + random.nextInt(100), 50 + random.nextInt(100), 50 + random.nextInt(100)));
			g.setFont(new Font(fontTypes[random.nextInt(fontTypes.length)],Font.BOLD,26)); 
			g.drawString(r, 15 * i + 5, 19 + random.nextInt(8));
//			g.drawString(r, i*w/4, h-5);
			s.append(r);
		}
		return s.toString();
	}

}
时间: 2024-10-13 23:48:42

Java实现Web页面前数字字母验证码实现的相关文章

Java实现web页面内容抓取

1 package demo; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 8 /** 9 * web页面内容抓取 10 * @author sy 11 * 12 */ 13 public class GrabWebHtml{ 14 15 public static void

java图形验证码生成工具类及web页面校验验证码

最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善. 验证码生成器: [html] view plain copy print? import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; im

java web 程序---猜数字游戏

思路:1.第一个是随机产生的数字,告诉我们去猜  cai.jsp 2.第二个是一个form表单,提交按钮后,将连接到验证页面 test1.jsp 3.第三个是比较猜的数和随机数.对了,提示再玩一次,不对则继续猜.用一个超链接 test2.jsp 老师的思路越来越难搞了.怎么写啊,用到hashMap时候 cai.jsp ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <%@ page lang

java验证,”支持6-20个字母、数字、下划线或减号,以字母开头“这个的正则表达式怎么写?

转自:https://yq.aliyun.com/wenzhang/show_96854 问题描述 java验证,"支持6-20个字母.数字.下划线或减号,以字母开头"这个的正则表达式怎么写? 验证"支持6-20个字母.数字.下划线或减号,以字母开头"的正则表达式怎么写,谢谢亲们的帮助··················· 解决方案 ^[a-zA-Z][a-zA-Z0-9_-]{519}$ 原文地址:https://www.cnblogs.com/sharpest/

数字字母混合的4位验证码

不管是在app注册.登录里,还是在网页注册里,都会看到验证码:那这个验证码要怎么实现呢?通过js有两种方法可以达到这样的效果,下面代码奉上哦! 方法一:这个方法比较好理解,首先定义一个数组,将会产生的字母,数值都放进去:有4位就循环4次,每循环一次产生一个随机结果,将每次的结果累加起来存入想要放的位置. 1 var arr=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', '

Hadoop-1,web页面调用报无hbase.jar包【以解决】 2,报java.lang.NoSuchMethodError: org.eclipse.jdt.internal.compiler.CompilationResult.getProblems()[Lorg/eclipse/jdt/core/compiler/IProblem;【以解决】

1:web页面调用报无hbase.jar包 本来java文件就没有问题,但是jsp一调用那个java文件里的方法就报错,报的无hadoop/hbase相关报的问题. 主要解决方法是: 复制hbase/lib里面的jar包到hadoop的lib文件里 然后再打开hadoop/etc/hadoop/hadoop-env.sh 增加这一句: 1 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/local/hbase/lib/*:/usr/lib/hbase

java多线程轮流打印数字字母案例代码

本案例演示3个线程轮流打印输出数字字母:代码如下 package thread; public class ThreadTest { public static void main(String[] args) { Print print = new Print(); new Thread(()->{ print.printNum(); }).start(); new Thread(()->{ print.printZimu(); }).start(); new Thread(()->{

开源 java CMS - FreeCMS2.3 Web页面信息采集

原文地址:http://javaz.cn/site/javaz/site_study/info/2015/23312.html 项目地址:http://www.freeteam.cn/ Web页面信息采集 从FreeCMS 2.1开始支持 通过简单配置即可抓取目标网页信息,支持增量式采集.关键字替换.定时采集,同一采集规则可采集多个页面(静态和动态),可采集多种信息属性,可自动审核且静态化信息页面. 采集规则管理 从左侧管理菜单点击采集规则进入. 添加采集规则 在采集规则列表下方点击"添加&qu

为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架 由struts2迁移到springMVC,我突然有了一个新的疑问无法得到正确的解释,为什么我们现在做java的web开发,会选择struts2或 者springMVC这样的框架,而不是使用servlet加jsp这样的技术呢?特别是现在我们web的前端页面都是使用velocity这样的模板语 言进行开发,抛弃了jsp,这样的选择又会给我们java的web开发带