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

  前段页面实现代码:

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

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

  后台 Controller处理:

  package com.njcc.pay.controller.login;

  import java.awt.Color;

  import java.awt.Font;

  import java.awt.Graphics;

  import java.awt.p_w_picpath.BufferedImage;

  import java.io.IOException;

  import java.io.OutputStream;

  import java.util.Random;

  import javax.p_w_picpathio.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("p_w_picpath/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 p_w_picpath = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

  Graphics g = p_w_picpath.getGraphics();

  /*

  * 生成背景

  */

  createBackground(g);

  /*

  * 生成字符

  */

  String s = createCharacter(g);

  request.getSession().setAttribute(VALIDATE_CODE, s);

  g.dispose();

  OutputStream out = response.getOutputStream();

  ImageIO.write(p_w_picpath, "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;

  }郑州妇科医院http://jbk.39.net/yiyuanzaixian/sysdfkyy/

  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();

  }

  }

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

  1. Servlet实现数字字母验证码图片(二)

    Servlet实现数字字母验证码图片(二): 生成验证码图片主要用到了一个BufferedImage类,如下:

  2. Java selenium web页面的滚动条操作

    摘录自:http://blog.csdn.net/iceryan/article/details/8162703 //移动到元素element对象的"顶端"与当前窗口的" ...

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

    最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善. 验证码生成器: import javax.imageio.ImageIO; import java.awt.*; import ja ...

  4. web页面 验证码 生成

    web页面 验证码 生成 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kapt ...

  5. JAVA整合kaptcha生成验证码 (字母验证码和算术验证码)

    引入maven <!--图片验证码--> <dependency> <groupId>com.github.penggle</groupId> < ...

  6. paip.powerdesign cdm pdm文件 代码生成器 java web 页面 实现

    paip.powerdesign cdm pdm文件 代码生成器 java web 页面 实现 准备从pd cdm生成java web 页面...但是,ms无直接地生成软件.... 只好自己解析cdm ...

  7. Java用webSocket实现tomcat的日志实时输出到web页面

    原文:http://blog.csdn.net/smile326/article/details/52218264 1.场景需求 后台攻城狮和前端攻城狮一起开发时,经常受到前端攻城狮的骚扰,动不动就来 ...

  8. Java随机生成定长纯数字或数字字母混合数

    (转)Java随机生成定长纯数字或数字字母混合数 运行效果图: 具体实现代码

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

    转自:https://yq.aliyun.com/wenzhang/show_96854 问题描述 java验证,”支持6-20个字母.数字.下划线或减号,以字母开头“这个的正则表达式怎么写? 验证” ...

随机推荐

  1. 理解Objective-C Runtime(四)Method Swizzling

    Objective-C对象收到消息之后,究竟会调用何种方法需要在运行期间才能解析出来.那你也许会问:与给定的选择子名称相应的方法是不是也可以在runtime改变呢?没错,就是这样.若能善用此特性,则可 ...

  2. WC2017游记

    Day0 到杭州之后出了点锅换了辆车,等了好久才开= =到宿舍发现路由器就在房门口,稳啊,过了一会儿就连不上了= =而且只有门口那个连不上,可以连上楼下的= =之后干了啥也忘了…… Day1 上午直接 ...

  3. 【HDU 3613】Best Reward

    [题目链接] 点击打开链接 [算法] 正反两遍EXKMP,即可 [代码] #include<bits/stdc++.h> using namespace std; #define MAXC ...

  4. JAVA RTTI

    基础类可接收我们发给派生类的任何消息,因为两者拥有完全一致的接口.我们要做的全部事情就是从派生上溯造型,而且永远不需要回过头来检查对象的准确类型是什么.所有细节都已通过多态性获得了完美的控制. 但经过 ...

  5. FTP两种工作模式:主动模式(Active FTP)和被动模式

    在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的FTP数据端口 ...

  6. E20170417-sl

    recursive adj.递归的 strategy n.战略

  7. Android Studio新建类头部注释和添加函数注释模板及快捷键

    一,Android Studio新建类头部注释 是不是有时候看到这个很心烦 其实Studio中有设置修改这些注释模板的信息的功能 其实很简单,只需要两步: 1.打开Setting设置面板,找到File ...

  8. hdoj1028;他们说这题叫dp...

    #include<cstdio> #include<string> #include<iostream> #include<vector> #inclu ...

  9. NOIp 2014 解方程 【数学/秦九韶算法/大数取膜】By cellur925

    题目传送门 题意:求高次方程的解及其个数.其中 1° 我们知道,高次方程是没有求根公式的.但是利用逆向思维,我们可以进行“试根法”,因为题目中给出了所求根的范围.但是多项式系数过于吓人,达到了sxbk ...

  10. 递归(Recursion)

    递归是一种非常常用的算法,分为“递”和“归”两个步骤.满足递归算法有三个条件:1.一个问题,可以分解为子问题:2.该问题,与分解后的子问题,解决思路一致:3.存在终止条件.案例演示:假设有n个台阶,每 ...