javaweb登录验证码的实现方法

本文实例为大家分享了javaweb登录验证码的具体代码,供大家参考,具体内容如下

使用:

Controller:生成验证码

@RequestMapping("/user/check.jpg")
  public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // 通知浏览器不要缓存
    response.setHeader("Expires", "-1");
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "-1");
    CaptchaUtil util = CaptchaUtil.Instance();
    // 将验证码输入到session中,用来验证
    String code = util.getString();
    request.getSession().setAttribute(“code”, code);
    // 输出打web页面
    ImageIO.write(util.getImage(), "jpg", response.getOutputStream());
  } 

jsp:显示验证码

<img id="img" src="<%=basePath%>user/check.jpg" onclick="refresh()">
function refresh() {
  var url = $("#basePath").val() + "user/check.jpg?number="+Math.random();
  $("#img").attr("src",url);
}

验证:

获取session中的code与前台传回的code是否一致

/**
   * 验证码验证
   *
   * @param session
   * @param code
   */
  private void checkCode(HttpSession session, String code) {
    String codeSession = (String) session.getAttribute(“code”);
    if (StringUtils.isEmpty(codeSession)) {
      log.error("没有生成验证码信息");
      throw new IllegalStateException("ERR-01000");
    }
    if (StringUtils.isEmpty(code)) {
      log.error("未填写验证码信息");
      throw new BussinessException("ERR-06018");
    }
    if (codeSession.equalsIgnoreCase(code)) {
      // 验证码通过
    } else {
      log.error("验证码错误");
      throw new BussinessException("ERR-06019");
    }
  } 

工具类:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
 * 验证码生成工具
 * @author HXL
 *
 */
public class CaptchaUtil {
  private BufferedImage image;// 图像
  private String str;// 验证码
  private static char code[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray(); 

  public static final String SESSION_CODE_NAME="code"; 

  private CaptchaUtil() {
    init();// 初始化属性
  } 

  /*
   * 取得RandomNumUtil实例
   */
  public static CaptchaUtil Instance() {
    return new CaptchaUtil();
  } 

  /*
   * 取得验证码图片
   */
  public BufferedImage getImage() {
    return this.image;
  } 

  /*
   * 取得图片的验证码
   */
  public String getString() {
    return this.str;
  } 

  private void init() {
    // 在内存中创建图象
    int width = 85, height = 20;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    // 获取图形上下文
    Graphics g = image.getGraphics();
    // 生成随机类
    Random random = new Random();
    // 设定背景色
    g.setColor(getRandColor(200, 250));
    g.fillRect(0, 0, width, height);
    // 设定字体
    g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160, 200));
    for (int i = 0; i < 155; i++) {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      g.drawLine(x, y, x + xl, y + yl);
    }
    // 取随机产生的认证码(4位数字)
    String sRand = "";
    for (int i = 0; i < 4; i++) {
      String rand = String.valueOf(code[random.nextInt(code.length)]);
      sRand += rand;
      // 将认证码显示到图象中
      g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
      // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
      g.drawString(rand, 13 * i + 6, 16);
    }
    // 赋值验证码
    this.str = sRand; 

    // 图象生效
    g.dispose();
    // ByteArrayInputStream input = null;
    // ByteArrayOutputStream output = new ByteArrayOutputStream();
    // try {
    // ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
    // ImageIO.write(image, "JPEG", imageOut);
    // imageOut.close();
    // input = new ByteArrayInputStream(output.toByteArray());
    // } catch (Exception e) {
    // System.out.println("验证码图片产生出现错误:" + e.toString());
    // }
    // this.image = input
    this.image = image;/* 赋值图像 */
  } 

  /*
   * 给定范围获得随机颜色
   */
  private Color getRandColor(int fc, int bc) {
    Random random = new Random();
    if (fc > 255)
      fc = 255;
    if (bc > 255)
      bc = 255;
    int r = fc + random.nextInt(bc - fc);
    int g = fc + random.nextInt(bc - fc);
    int b = fc + random.nextInt(bc - fc);
    return new Color(r, g, b);
  }
} 

最后说明一点: 登录拦截器必须要放行生成验证码路径! 登录拦截器必须要放行生成验证码路径!! 登录拦截器必须要放行生成验证码路径!!!重要的事情说三遍~~

最后展示:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaWeb 实现验证码功能(demo)

    验证码不用多说,在 WEB-APP 中一般应用于:登录.注册.买某票.秒杀等场景.大家都接触过~可以说是千奇百怪,各式各样. DEMO 目标功能 验证码页面输入. 页面更换验证码(异步实现). 后台验证并返回验证结果. 开工 页面:demo1.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html> &l

  • Java随机生成手机短信验证码的方法

    本文实例讲述了Java随机生成手机短信验证码的方法.分享给大家供大家参考,具体如下: /** * 创建指定数量的随机字符串 * @param numberFlag 是否是数字 * @param length * @return */ public static String createRandom(boolean numberFlag, int length){ String retStr = ""; String strTable = numberFlag ? "1234

  • java登录验证码实现代码

    VerifyCodeServlet.java类: 复制代码 代码如下: package com.spring.controller;import java.awt.Color;         import java.awt.Font;         import java.awt.Graphics2D;         import java.awt.image.BufferedImage;         import java.util.Random;         import ja

  • java 图片验证码的实现代码

    复制代码 代码如下: makeCertPic.java package pic; 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.imagei

  • Java实现仿淘宝滑动验证码研究代码详解

    通过下面一张图看下要实现的功能,具体详情如下所示: 现在我就来介绍些软件的其它功能.希望大家有所受益. 模拟人为搜索商品 在刷单的时候,不能直接拿到一个商品网址就进入购买页面吧,得模拟人为搜索. 在这一个过程中有两个难点: 1)商品列表的异步加载 ; 2)翻页并且截图; 在园子里,我就不在关公面前耍大刀了. 直接上关键代码: i:搜索商品,并且翻页 public bool? SearchProduct(TaskDetailModel taskDetailData) { bool? result

  • javaWeb使用Kaptcha组件生成验证码

    javaWeb之使用Kaptcha组件使用验证码 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="htt

  • Java 随机生成验证码(支持大小写字母、数字、随机字体)的实例

    代码如下所示: 复制代码 代码如下: package com.hoo.util; import java.awt.Color;  import java.awt.Font;  import java.awt.Graphics;  import java.awt.image.BufferedImage;  import java.util.Random; import javax.imageio.ImageIO;  import javax.servlet.http.HttpServletRequ

  • Java Web开发之图形验证码的生成与使用方法

    本文实例讲述了Java Web开发之图形验证码的生成与使用方法.分享给大家供大家参考.具体如下: 图形验证码的主要目的是为了增强的安全性,增加用户通过遍历所有可能性来破解密码的难度. 图形验证码的使用包括如下3部分: ① 图形验证码的生成: ② 在页面中的使用: ③ 验证: 1.图形验证码的生成 假设在Servlet生成图形验证码,在JavaBean或者JSP中生成的基本过程是相同的.设计如下过程: ① 设置响应的文档类型: ② 生成随机码: ③ 把随机码保存到session中: ④ 生成图片:

  • Javaweb开发中通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.response.study; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; i

  • Java实现验证码具体代码

    这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能. Java实现验证码的步骤: 1.创建RandomImageGenerator.java类,该类实现验证码图片的生成 2.创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面 3.创建一个Action类,LoginAction.java,控制登录 4.配置struts.xml一个web.xml文件 5.编写页面 具体实现用代码表达 1.创建RandomImageGener

随机推荐