• Java代码生成图片验证码


    1.jsp页面显示验证码,src跳转到Controller里的:getImg_validate,reloadImg()作用是点击验证码就会换一张(重新请求getImg_validate)

    <ul>
    <li >验证码: </li>
    <li >
    <img id="img_validate" src="<%=basePath%>image/getImg_validate" onclick="reloadImg()">
    <input type="text" name="yanzhengma" id="yanzhengma" placeholder="请输入验证码"/>
    </li> 
    </ul>
    
    
    <script type="text/javascript">
    
    function reloadImg() {
    
    document.getElementById("img_validate").src="<%=basePath%>image/getImg_validate";
    }
    
    </script>
    View Code

    2.写一个ImageUtil工具类,在里面可以自定义图片生成的大小,字体大小,背景色,验证码个数,干扰线条条数等等

    package com.svse.house.util;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.util.Random;
    
    public class ImageUtil {
    
    //1.定义变量保存生成后的验证码字符串
    static String code = "";
    
    //2.生成验证码
    public static String createcode() {
    code = "";
    String a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";//随机生成的字符范围(0-9,a-z,A-Z)
    
    //生成验证码的位数(这里是4位)
    for (int i = 0; i < 4; i++) {
    int index = (int) (Math.random() * 62);//会产生一个[0,62)的数,不包含小数
    char b = a.charAt(index);
    code = code + b;
    }
    return code;
    }
    
    //查看已经生成的验证码
    public static String getCode() {
    return code;
    }
    
    //3.生成图片
    public static BufferedImage createimage() {
    // 前2个参数为:width, height.后面是图像类型
    //创建一个不带透明色的BufferedImage对象,TYPE_INT_ARGB为带透明色
    BufferedImage bi = new BufferedImage(130,50, BufferedImage.TYPE_INT_RGB);
    
    //1.得到一个画布
    Graphics g = bi.getGraphics();
    //2.添加背景颜色
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, 130, 50);
    
    //3.添加干扰线
    for (int i = 0; i < 10; i++) {
    Random r = new Random();
    int red = r.nextInt(256);
    int green = r.nextInt(256);
    int blue = r.nextInt(256);
    Color c = new Color(red, green, blue);
    g.setColor(c);
    int x1 = r.nextInt(131);
    int y1 = r.nextInt(51);
    int x2 = r.nextInt(131);
    int y2 = r.nextInt(51);
    g.drawLine(x1,y1,x2,y2);//画线
    //g.drawOval(x1, y1, x2, y2);//画曲线
    }
    
    
    //3.添加文字
    g.setColor(Color.BLACK);
    g.setFont(new Font("宋体", Font.BOLD, 50));
    
    String str = getCode();
    //4.将文字填充到画板中
    g.drawString(str, 15, 40);
    
    //5.关闭画布
    g.dispose();
    return bi;
    }
    
    }
    View Code

    3.在controller层调用getImg_validate,试用过jpeg和bmp格式的setContentType,都可以

    package com.svse.house.controller;
    
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.svse.house.util.ImageUtil;
    
    @Controller
    @RequestMapping("/image")
    public class ImageController {
    @RequestMapping("/getImg_validate")
    public void yanzheng(HttpServletResponse response){
    try {
    ImageUtil.createcode();
    BufferedImage image = ImageUtil.createimage();
    //以流的方式返回给客户端
    response.setContentType("image/jpeg");
    //response.setContentType("image/bmp");
    ByteArrayOutputStream bt = new ByteArrayOutputStream();
    //将图片转换成字节流    
    ImageIO.write(image,"jpeg",bt);
    //ImageIO.write(image,"bmp",bt);
    //得到输出流,返回客户端
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(bt.toByteArray());
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    View Code

    4.最后的验证

    当时一直想在前台获取随机生成的四位数验证码来和自己输入的进行比较,可以通过session来获取但如果刷新验证码session里的值不会改变除非刷新整个页面。

    后来想想真傻,直接在后台比较不就好了吗。

  • 相关阅读:
    bootstap 折叠
    AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)
    Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)
    BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
    BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
    BZOJ 2759 一个动态树好题 (LCT)
    Codeforces 1205C Palindromic Paths (交互题、DP)
    getopt实现传参自动识别
    powershell笔记
    bat语法需要注意的地方
  • 原文地址:https://www.cnblogs.com/jjqq0921/p/qin_0921.html
Copyright © 2020-2023  润新知