java springmvc实现验证码功能

本文实例为大家分享了springmvc实现验证码功能展示的具体代码,供大家参考,具体内容如下

先看效果图:

思路:

首先验证码是一张图片,是一张有着随机字母、数字、图案等组成的图片,所以这图片肯定不是固定不变的,肯定是由后端随机制造出来的,前端用img的src去不断访问这个制造的方法。

第一步:前端页面编写

登录使用的是ajax方法,所以使用的是调用点击事件进行,验证码的图片放在a标签中是为了方便点击变换验证码。显示图片用的是img的src属性,因为使用的是spingmvc所以调用后台方法使用action的方式。

<form>
   <div id="login_tip">
   管理员登录
   </div>
  <div><input type="text" id="user_code" name="user_code" class="username" placeholder="请输入账号"></div>
  <div><input type="password" id="user_account" name="user_account" class="pwd" placeholder="请输入密码"></div>
   <div id="btn_area">
      <input type="text" id="VerificationCode" name="VerificationCode" placeholder="请输入验证码" class="verify">
      <a href="javascript:void(0);" rel="external nofollow" onclick="VerificationCode()">
       <img id="randCodeImage" alt="验证码" src="VerificationCode/generate.action" width="100" height="40"/>
      </a>
     </div>
     <div style="float:left;">
      <input type="button" name="button" id="sub_btn" onclick="login()" value="登录"/>
     </div>
     <div id="verification_Code"><b></b></div>
</form>

第二步:编写JS代码

因为登录采用的是ajxa,所以后台登录会验证一些数据,不正确的会返回数据到登录页面。这里说明一下,在调用生成验证码的方法后面为什么要加一个随机数,这里的随机数以及这个随机数的参数名称可以随意写,后端不做任何操作的,这里是防止浏览器对一个相同方法进行调用时取缓存的方法,而点击图片或验证码输入错误不会自动刷新而改变图片的问题做处理。

<script type="text/javascript">
 function login(){
  //这是使用ajax的方式提交
  $.ajax({
   type:'post',
   url:'Uase/query.action',
   //data:$('#loginInputForm').serialize(),
   data:{
     'user_code' : $("#user_code").val(),
     'user_account' :$("#user_account").val(),
     'VerificationCode':$("#VerificationCode").val(),
   },
   dataType:'json',
   success:function(obj){
    var rad = Math.floor(Math.random() * Math.pow(10, 8));
    if(obj && obj.success=='true'){
     window.location.href='Uase/login.action';
    }else{
     document.getElementById("verification_Code"). innerHTML =obj.msg;
     //uuuy是随便写的一个参数名称,后端不会做处理,作用是避免浏览器读取缓存的链接
     $("#randCodeImage").attr("src", "VerificationCode/generate.action?uuuy="+rad);
     $("#VerificationCode").val("").focus(); // 清空并获得焦点
    }
   }
  });
 }

  /**
  *验证码刷新
  */
  function VerificationCode(){
   var rad = Math.floor(Math.random() * Math.pow(10, 8));
   //uuuy是随便写的一个参数名称,后端不会做处理,作用是避免浏览器读取缓存的链接
   $("#randCodeImage").attr("src", "VerificationCode/generate.action?uuuy="+rad);
  }

 </script>

第三步:编写后台Controller控制类

主方法为VerificationCode,里面会用到一些随机数生产的方法以及一些辅助类,全用用上就可以了,因为我这里用到了可以更改类型的验证码,所以用到了一个自己编写的公共的工具类。

@RequestMapping("/VerificationCode")
public class VerificationCodeController extends HttpServlet{
 private static final long serialVersionUID = 1L;

 /**
  * 这里用作存入session的名称
  */
 private static final String SESSION_KEY_OF_RAND_CODE = "randCode"; // todo 要统一常量

 /**
  *
  */
 private static final int count = 200;

 /**
  * 定义图形大小(宽)
  */
 private static final int width = 105;
 /**
  * 定义图形大小(高)
  */
 private static final int height = 35;
 /**
  * 干扰线的长度=1.414*lineWidth
  */
 private static final int lineWidth = 1;

 @RequestMapping(value = "/generate", method = { RequestMethod.POST,
   RequestMethod.GET })
 public void VerificationCode( HttpServletRequest request,
   HttpServletResponse response) throws ServletException,
   IOException {
   // 设置页面不缓存
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    // response.setContentType("image/png");
    // 在内存中创建图象
    final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // 获取图形上下文
    final Graphics2D graphics = (Graphics2D) image.getGraphics();

    // 设定背景颜色
    graphics.setColor(Color.WHITE); // ---1.Color.WHITE为白色
    graphics.fillRect(0, 0, width, height);//填充衍射
    // 设定边框颜色
    //graphics.setColor(getRandColor(100, 200)); // ---2.这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255
    graphics.drawRect(0, 0, width - 1, height - 1);

    final Random random = new Random();
    // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
    for (int i = 0; i < count; i++) {
     graphics.setColor(getRandColor(150, 200)); // ---3.

     final int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
     final int y = random.nextInt(height - lineWidth - 1) + 1;
     final int xl = random.nextInt(lineWidth);
     final int yl = random.nextInt(lineWidth);
     graphics.drawLine(x, y, x + xl, y + yl);
    }
    // 取随机产生的认证码(4位数字)
    final String resultCode = exctractRandCode();
    for (int i = 0; i < resultCode.length(); i++) {
     // 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
     // graphics.setColor(new Color(20 + random.nextInt(130), 20 + random
     // .nextInt(130), 20 + random.nextInt(130)));

     // 设置字体颜色
     graphics.setColor(Color.BLACK);
     // 设置字体样式
     //graphics.setFont(new Font("Arial Black", Font.ITALIC, 18));
     graphics.setFont(new Font("Times New Roman", Font.BOLD, 24));
     // 设置字符,字符间距,上边距
     System.out.print(resultCode.charAt(i));
     graphics.drawString(String.valueOf(resultCode.charAt(i)), (23 * i) + 8, 26);
    }
    System.out.println("直接输出:"+resultCode);
    // 将认证码存入SESSION
    request.getSession().setAttribute(SESSION_KEY_OF_RAND_CODE, resultCode);
    // 图象生效
    graphics.dispose();

    // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
 }

 /**
  * @return 随机码
  */
 private String exctractRandCode() {
  final String randCodeType = ResourceUtil.getRandCodeType();
  int randCodeLength = Integer.parseInt(ResourceUtil.getRandCodeLength());
  if (randCodeType == null) {
   return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);
  } else {
   switch (randCodeType.charAt(0)) {
   case '1':
    return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);
   case '2':
    return RandCodeImageEnum.LOWER_CHAR.generateStr(randCodeLength);
   case '3':
    return RandCodeImageEnum.UPPER_CHAR.generateStr(randCodeLength);
   case '4':
    return RandCodeImageEnum.LETTER_CHAR.generateStr(randCodeLength);
   case '5':
    return RandCodeImageEnum.ALL_CHAR.generateStr(randCodeLength);

   default:
    return RandCodeImageEnum.NUMBER_CHAR.generateStr(randCodeLength);
   }
  }
 }

 /**
  * 描述:根据给定的数字生成不同的颜色
  * @param 这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255
  * @param 这是以数字型来设置颜色,颜色模式是指使用三种基色:红、绿、蓝,通过三种颜色的调整得出其它各种颜色,这三种基色的值范围为0~255
  * @return 描述:返回颜色
  */
 private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
  final Random random = new Random();
  if (fc > 255) {
   fc = 255;
  }
  if (bc > 255) {
   bc = 255;
  }

  final int r = fc + random.nextInt(bc - fc);
  final int g = fc + random.nextInt(bc - fc);
  final int b = fc + random.nextInt(bc - fc);

  return new Color(r, g, b);
 }

 /**
  * 验证码辅助类
  */
 enum RandCodeImageEnum {
  /**
   * 混合字符串
   */
  ALL_CHAR("0123456789abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), // 去除小写的l和o这个两个不容易区分的字符;
  /**
   * 字符
   */
  LETTER_CHAR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"),
  /**
   * 小写字母
   */
  LOWER_CHAR("abcdefghijklmnopqrstuvwxyz"),
  /**
   * 数字
   */
  NUMBER_CHAR("0123456789"),
  /**
   * 大写字符
   */
  UPPER_CHAR("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  /**
   * 待生成的字符串
   */
  private String charStr;

  /**
   * @param charStr
   */
  private RandCodeImageEnum(final String charStr) {
   this.charStr = charStr;
  }

  /**
   * 生产随机验证码
   *
   * @param codeLength
   *   验证码的长度
   * @return 验证码
   */
  public String generateStr(final int codeLength) {
   final StringBuffer sb = new StringBuffer();
   final Random random = new Random();
   final String sourseStr = getCharStr();

   for (int i = 0; i < codeLength; i++) {
    sb.append(sourseStr.charAt(random.nextInt(sourseStr.length())));
   }

   return sb.toString();
  }

  /**
   * @return the {@link #charStr}
   */
  public String getCharStr() {
   return charStr;
  }

 }
}

第四步:编写公用的工具类

/**
 * 项目参数工具类
 *
 */
public class ResourceUtil {

 private static final ResourceBundle bundle = java.util.ResourceBundle.getBundle("sysConfig");
 /**
  * 获取随机码的长度
  *
  * @return 随机码的长度
  */
 public static String getRandCodeLength() {
  return bundle.getString("randCodeLength");
 }

 /**
  * 获取随机码的类型
  *
  * @return 随机码的类型
  */
 public static String getRandCodeType() {
  return bundle.getString("randCodeType");
 }

}

第五步:配置sysConfig.properties

randCodeLength=4
randCodeType=5

第六步:到这里就大功告成了,可以试试效果了

(0)

相关推荐

  • springboot的java配置方式(实例讲解)

    1.创建User实体类. @Data public class User { private String username; private String password; private Integer age; } 2.创建UserDao用于模拟数据库交互. public class UserDao{ public List<User> queryUserList() { List<User> result = new ArrayList<User>(); //

  • Java编程实现springMVC简单登录实例

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等. 1.新建web项目:springmvc 2.导入springmvc需要的jar包 3.配置web.xml文件(核心代码)

  • spring学习之创建项目 Hello Spring实例代码

    本文研究的主要是spring学习之创建项目 Hello Spring实例代码,具体如下. 一.创建eclipse项目,引入jar包 1.eclipse创建java project项目 HelloSpring 2.创建lib目录,加入spring必须的5个jar包 3.选中5个文件,右键 -> Build Path -> add to build path 二.编写spring的hello spring代码 1.创建包io.spring.beans,并编写HelloWorld.java pack

  • 通过Spring Shell 开发 Java 命令行应用

    提到 Java,大家都会想到 Java 在服务器端应用开发中的使用.实际上,Java 在命令行应用的开发中也有一席之地.在很多情况下,相对于图形用户界面来说,命令行界面响应速度快,所占用的系统资源少.在与用户进行交互的场景比较单一时,命令行界面是更好的选择.命令行界面有其固定的交互模式.通常是由用户输入一系列的参数,在执行之后把相应的结果在控制台输出.命令行应用通常需要处理输入参数的传递和验证.输出结果的格式化等任务.Spring Shell 可以帮助简化这些常见的任务,让开发人员专注于实现应用

  • Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(图文)

    本文主要介绍了Java框架搭建之Maven.Mybatis.Spring MVC整合搭建(图文),分享给大家,具体如下: SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式,将整个系统划分为显示层.Controller层.Service层.Dao层四层,使用SpringMVC负责请求的转发和视图管理,Spring实现业务对象管理, MyBatis作为数据对象持久化引擎. 框架详情 Spring 是一个轻量级的Java开发框架,它是为了解

  • java使用spring实现读写分离的示例代码

    最近上线的项目中数据库数据已经临近饱和,最大的一张表数据已经接近3000W,百万数据的表也有几张,项目要求读数据(select)时间不能超过0.05秒,但实际情况已经不符合要求,explain建立索引,使用redis,ehcache缓存技术也已经满足不了要求,所以开始使用读写分离技术,可能以后数据量上亿或者更多的时候,需要再去考虑分布式数据库的部署,但目前来看,读写分离+缓存+索引+表分区+sql优化+负载均衡是可以满足亿级数据量的查询工作的,现在就一起来看一下亲测可用的使用spring实现读写

  • Java中Spring WebSocket详解

    首先 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> </parent> <dependency> <groupId>org.apache.com

  • SpringBoot文件上传控制及Java 获取和判断文件头信息

    之前在使用SpringBoot进行文件上传时,遇到了很多问题.于是在翻阅了很多的博文之后,总算将上传功能进行了相应的完善,便在这里记录下来,供自己以后查阅. 首先,是建立一个标准的SpringBoot 的工程,这里使用的IDE是Intellij Idea,为了方便配置,将默认的配置文件替换为了application.yml. 1.在index.html中进行文件上传功能,这里使用的文件上传方式是ajax,当然也可以按照自己的具体要求使用传统的表单文件上传. <!DOCTYPE html> &l

  • java springmvc实现验证码功能

    本文实例为大家分享了springmvc实现验证码功能展示的具体代码,供大家参考,具体内容如下 先看效果图: 思路: 首先验证码是一张图片,是一张有着随机字母.数字.图案等组成的图片,所以这图片肯定不是固定不变的,肯定是由后端随机制造出来的,前端用img的src去不断访问这个制造的方法. 第一步:前端页面编写 登录使用的是ajax方法,所以使用的是调用点击事件进行,验证码的图片放在a标签中是为了方便点击变换验证码.显示图片用的是img的src属性,因为使用的是spingmvc所以调用后台方法使用a

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • java实现登录验证码功能

    本文实例为大家分享了java实现登录验证码功能的具体代码,供大家参考,具体内容如下 登录验证码 登录验证是大多数登录系统都会用到的一个功能,它的验证方式也是有很多种,例如登录验证码,登录验证条及拼图拖动块等,这里讲讲输入登录验证码的方式来实现的例子.首先,kaptcha这是一个开源的验证码实现库,利用这个库可以非常方便的实现验证码功能. 1.添加依赖 在pom文件下添加kaptcha依赖包 <!-- https://mvnrepository.com/artifact/com.github.ax

  • java制作简单验证码功能

    本文实例为大家分享了java制作简单验证码的具体代码,供大家参考,具体内容如下 在这里我们需要用到java的画笔工具,所以我们需要导入以下包 import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" 然后我就使用java脚本来实现一个小小的验证码 <%@ page contentType="image/jpeg; charset=utf-8" language="java&quo

  • Java实现随机验证码功能实例代码

    现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用.验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行番茄花园xp系统下载提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 复制代码 代码如下: package com.servlet;import java.awt

  • 解析Java实现随机验证码功能的方法详解

    现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用.验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度.    我们可以使用servlet来实现随机验证码的实现. 复制代码 代码如下: package com.servlet; 

  • java实现网页验证码功能

    本文实例为大家分享了java网页验证码的实现代码,供大家参考,具体内容如下 Servlet: package cn.bdqn.servlet; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.

  • Java开发完整短信验证码功能的全过程

    目录 前言 闲扯 使用技术 所需知识储备 实现步骤 总结 前言 现代互联网项目中,很多场景下都需要使用一种叫做验证码的技术,常用的有图片验证码,滑块验证码,短信验证码等,本文章描述的就是短信验证码的一个使用教程,从0开始完成一个验证码功能的开发. 闲扯 是不是看着导语很高大上!!! 我才不会说是因为最近不知道写啥才水的一篇文章 但是嘛,我要争取做到水文章也水的特别认真,让读者可以根据本文的教程实现验证码功能 使用技术 Java:所使用的后端技术 JSP:所使用的前端技术 阿里云短信服务:发送短信

  • java web中图片验证码功能的简单实现方法

    用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

  • Java案例之随机验证码功能实现实例

    实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的.嘿嘿. 先上效果图: 源代码: RandomGen.java(实现产生验证码功能的类) package verificationcode; import java.util.Random; public class RandomGen { //生成四位不重复的验证码 public static S

随机推荐