首页 > 编程 > Java > 正文

javaweb登录验证码的实现方法

2019-11-26 10:51:41
字体:
来源:转载
供稿:网友

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

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

最后展示:

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表