博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java生成图片验证码
阅读量:2432 次
发布时间:2019-05-10

本文共 4424 字,大约阅读时间需要 14 分钟。

package com.tantuls.login.controller;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.common.tools.StringTools;/** * 验证码处理控制类 
<功能详细描述>
* * @author chenlujun * @version [版本号, 2014-9-30] * @see [相关类/方法] * @since [产品/模块版本] */@Controller@Scope("prototype")@RequestMapping("/signcode")public class SignCodeController { /** 检查验证码 * 用户登录的时候避免暴力破解加上图片验证码 * @param request * @param signcode 传入的验证码 * @return true 验证通过,输入的验证码和生成的一致 * false 验证不过,输入的验证码和后台生成的不一致 * @see [类、类#方法、类#成员] */ @RequestMapping("/check") @ResponseBody public boolean checkSignCode(HttpServletRequest request,String signcode) { HttpSession session = request.getSession(); String signcodeSession=(String)session.getAttribute("signcode"); if(StringTools.isNull(signcode)) { return false; } if(StringTools.isNull(signcodeSession)) { return false; } //验证的时候不区分大小写 signcode=signcode.toUpperCase(); signcodeSession=signcodeSession.toUpperCase(); if(signcode.equals(signcodeSession)) { return true; } return false; } /** 生成验证码 * 生成验证码直接从内存中写入输出流; * 图片文件不存盘 * @param request * @param response * @throws ServletException * @throws IOException * @see [类、类#方法、类#成员] */ @RequestMapping(value = "/get", method = RequestMethod.GET) public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 验证码图片的宽度。 int width = 70; // 验证码图片的高度。 int height = 30; BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = buffImg.createGraphics(); // 创建一个随机数生成器类。 Random random = new Random(); // 设定图像背景色(因为是做背景,所以偏淡) g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); // 创建字体,字体的大小应该根据图片的高度来定。 Font font = new Font("Times New Roman", Font.HANGING_BASELINE, 28); // 设置字体。 g.setFont(font); // 画边框。 g.setColor(Color.BLACK); g.drawRect(0, 0, width - 1, height - 1); // 随机产生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); } // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。 StringBuffer randomCode = new StringBuffer(); // 设置默认生成4个验证码 int length = 4; // 设置备选验证码:包括"a-z"和数字"0-9" String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; int size = base.length(); // 随机产生4位数字的验证码。 for (int i = 0; i < length; i++) { // 得到随机产生的验证码数字。 int start = random.nextInt(size); String strRand = base.substring(start, start + 1); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110))); g.drawString(strRand, 15 * i + 6, 24); // 将产生的四个随机数组合在一起。 randomCode.append(strRand); } // 将四位数字的验证码保存到Session中。 HttpSession session = request.getSession(); session.setAttribute("signcode", randomCode.toString()); // 图象生效 g.dispose(); // 禁止图像缓存。 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); // 将图像输出到Servlet输出流中。 ServletOutputStream sos = response.getOutputStream(); ImageIO.write(buffImg, "jpeg", sos); sos.flush(); sos.close(); } // 给定范围获得随机颜色 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); }}

使用:

转载地址:http://pzvmb.baihongyu.com/

你可能感兴趣的文章
Thymeleaf中一个页面怎么嵌套另一个页面,关于页面嵌套,标签告诉你应该知道的
查看>>
JAVA如何实现短信验证码--阿里云接口,新手式图文教学,个人项目有这一篇就够了
查看>>
Java中大小数BigDecimal的加减乘除用法及场景的详细介绍,看完不信你还会报Syntax error on token “+/-/*“, invalid AssignmentOperat异常
查看>>
UVa 10917 Dijkstra
查看>>
CF403B/CF402D
查看>>
CF402E / 403C
查看>>
cf404b
查看>>
cf404c
查看>>
cf404d
查看>>
武大网络预赛 Problem 1537 - A - Stones I
查看>>
武大网络预赛 Problem 1545 - I - Twenty-four
查看>>
ZOJ Problem Set - 3772 Calculate the Function 矩阵+线段树
查看>>
ZOJ Problem Set - 3768 Continuous Login
查看>>
某山面试 3、实现如下函数:
查看>>
malloc的小知识
查看>>
UVALive 6755 - Swyper Keyboard
查看>>
uva_11029 Leading and Trailing 快速幂 数的n次方前几位
查看>>
uva10023 手算开方的方法
查看>>
uva11027
查看>>
欧拉函数——从容斥定理和积性函数的性质谈开
查看>>