javaweb登录验证码的实现方法

作者:imhxl 时间:2021-09-12 05:00:08 

本文实例为大家分享了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);
}
}

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

最后展示:

javaweb登录验证码的实现方法

来源:http://blog.csdn.net/imhxl/article/details/52775512

标签:javaweb,登录,验证码
0
投稿

猜你喜欢

  • Spring的Aware接口你知道多少

    2023-01-19 12:44:20
  • 浅析Java中接口和抽象类的七大区别

    2022-01-16 21:09:36
  • java 域对象共享数据的实现

    2022-04-26 15:22:14
  • Android仿360悬浮小球自定义view实现示例

    2021-10-22 10:16:14
  • C#逆变与协变详解

    2021-10-25 08:07:54
  • Java对象数组定义与用法详解

    2021-11-01 08:33:18
  • Android通过自定义View实现随机验证码

    2022-10-24 07:16:19
  • Android利用Badge组件实现未读消息小红点

    2021-11-09 10:30:33
  • SpringBoot中整合MyBatis-Plus-Join使用联表查询的实现

    2023-11-28 19:00:26
  • Java链表(Linked List)基本原理与实现方法入门示例

    2021-10-12 05:49:14
  • Java线程安全的计数器简单实现代码示例

    2023-11-09 15:41:57
  • Java Kafka实现延迟队列的示例代码

    2022-01-11 16:32:11
  • Spring Boot中使用Redis实战案例

    2021-06-03 04:17:04
  • Android波纹扩散效果之仿支付宝咻一咻功能实现波纹扩散特效

    2023-07-06 17:22:01
  • kotlin gson反序列化默认值失效深入讲解

    2022-04-07 15:28:59
  • Java调用linux shell脚本的方法

    2022-03-25 23:09:46
  • jmeter中json提取器如何提取多个参数值

    2022-08-10 00:08:27
  • 总结一次C++ 程序优化历程

    2023-11-02 22:38:30
  • c#打包文件解压缩的实例

    2022-07-22 11:20:20
  • SpringBoot+WebSocket实现即时通讯的方法详解

    2021-07-24 15:48:49
  • asp之家 软件编程 m.aspxhome.com