软件编程
位置:首页>> 软件编程>> java编程>> javaweb登录验证码的实现方法

javaweb登录验证码的实现方法

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

标签: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);
}
}

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

最后展示:

javaweb登录验证码的实现方法

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com