首页 > 其他分享 >如何实现「点击验证码,验证码刷新」的效果?

如何实现「点击验证码,验证码刷新」的效果?

时间:2023-09-24 14:13:47浏览次数:36  
标签:int random 验证码 点击 fc static 刷新 import

在注册或者登录时,因为验证码看不清,用户会想要换一个,方便的方式,是点击验证码,自动更换。

思路很简单,只需要在后台获取的验证码输出url,加上时间即可,url变化,验证码自然会跟着刷新。

开发环境(java)

前台示例:

<span><img id="registerCaptchaImg" src="${pageContext.request.contextPath}/registerCaptcha"></span>
<script type="text/javascript">
$(document).ready(function(){
    $("#registerCaptchaImg").click(function(){
        var src="${pageContext.request.contextPath}/registerCaptcha?zz="+(new Date()).getTime();
        $("#registerCaptchaImg").attr("src",src);
    });
});
</script>

后台示例:

生成验证码的工具类。

package main.util.captcha;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

public class MyCaptcha {
    private static int width = 90;// 图片宽
    private static int height = 35;// 图片高
    private static int lineSize = 18;// 干扰线数量

    private static Random random = new Random();

    private static final String[] characters = { "a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F",
            "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
            "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9" };

    /**
     * 产生随机字符串,四个字
     * 
     * @return
     */
    public static String createRandomStr() {
        String str = null;
        int length = characters.length;
        str = characters[random.nextInt(length)]
                + characters[random.nextInt(length)]
                + characters[random.nextInt(length)]
                + characters[random.nextInt(length)];
        return str;
    }

    /*
     * 产生随机颜色
     */
    private static Color getRandColor(int fc, int bc) {
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r, g, b);
    }

    public static BufferedImage getBufferedImage(String randomString) {

        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman", 0, 22));
        g.setColor(getRandColor(110, 133));
        // 绘制干扰线
        for (int i = 0; i <= lineSize; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(13);
            int yl = random.nextInt(15);
            g.drawLine(x, y, x + xl, y + yl);
        }
        // 绘制随机字符

        g.setColor(new Color(75, 85, 94));
        g.drawString(randomString, 10, 25);
        g.dispose();

        return image;
    }

}

生成验证码图片的servlet。

package main.control.client;

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import main.util.MyCalendar;
import main.util.captcha.MyCaptcha;

/**
 * Servlet implementation class ClientPostCaptchaServlet
 */
@WebServlet("/registerCaptcha")
public class ClientRegisterCaptchaServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ClientRegisterCaptchaServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/gif");

        ServletOutputStream responseOutputStream = response.getOutputStream();
        String captchaStr = MyCaptcha.createRandomStr();
        request.getSession().setAttribute("clientRegisterCaptcha", captchaStr);
        request.getSession().setAttribute("clientRegisterCaptcha_begain_time",
                Long.valueOf(MyCalendar.getCalendar().getTimeInMillis()));
        BufferedImage image = MyCaptcha.getBufferedImage(captchaStr);
        ImageIO.write(image, "JPEG", responseOutputStream);
        responseOutputStream.flush();
        responseOutputStream.close();

    }

}

//clientRegisterCaptcha_begain_time是验证码超时的参数,不用理会。

 

标签:int,random,验证码,点击,fc,static,刷新,import
From: https://www.cnblogs.com/coding8832/p/17725918.html

相关文章

  • python生成图片验证码的demo
    下面是一个使用Python生成图片验证码的简单示例:fromPILimportImage,ImageDraw,ImageFontimportrandomdefgenerate_captcha(text,width,height,font_path,font_size):#创建一个空白图片image=Image.new('RGB',(width,height),(255,255,255))dr......
  • 用户登录~生成图片验证码(identify(生成图片验证码)插件)
    1.效果图:2.以用户登录实现生成图片验证功能:使用identify(生成图片验证码)插件identify:这是一个vue的插件,使用canvas来生成图形验证码2.1下载identify插件,npm安装 npmiidentify2.2具体参数如下:2.2在components目录新建一个SIdentify.vue,把以下代码复制进去!<tem......
  • 访问api地址时添加cookie头,防止cookie刷新
    putSession(){wx.request({url:'http://127.0.0.1:8000/api/test1',success(res){console.log(res);wx.setStorageSync('session',res.cookies)},dataType:'json'})},get......
  • 记录--使用Canvas绘制一个验证码组件
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助使用Canvas绘制一个验证码组件前言验证码,这一日常伴随我们的要素,是我们在线交互的重要安全保障。你的手机短信里是否被它占据半壁江山,今天我们就来聊聊如何在网页上实现一个简单的验证码组件。大家在登录网站时......
  • 【验证码逆向专栏】螺丝帽人机验证逆向分析
    声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作......
  • 中文图形验证码 动态图形验证码 图片验证码 验证码【加逻辑思路解析】
    效果: 逻辑:生成数字随机数,再改为中文表示,返给前端。人为输入阿拉伯数字。(后端缓存中存入用户信息和随机数。做校验。)主要测试code:Randomrm=newRandom();Stringstrcode=Integer.toString(rm.nextInt(900000)+100000);System.out.println("生成......
  • js jquery input radio点击事件
     HTML:<inputtype="radio"name="myname"value="1"/>1<inputtype="radio"name="myname"value="2"/>2 jquery代码: //点击事件change$('input[type=radio][name=myname]').ch......
  • 点击指定按钮弹出指定按钮
    点击指定按钮弹出指定按钮(表格数据中,包含一列有操作按钮,点击某一按钮弹出相应的弹窗)首先给表格添加新的标识列,如果表格数据自带标识列可不加//将表格数据解构赋值给新增列isShow,indexuserData.value=userData.value.map((item,index1)=>{return{...item......
  • c# winform 点击窗体任意位置可以拖动
    c#winform窗体,点击窗体标题头可以拖动,如果鼠标点击在里面的panel的时候就没有这个效果了,以下实现拖动的方法。转载自醉低调publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}[DllImport("use......
  • .netCore 图形验证码,非System.Drawing.Common
    netcore需要跨平台,说白点就是放在windows服务器要能用,放在linux服务器上也能用,甚至macos上。很多时候需要使用到图形验证码,这就有问题了。旧方案1.引入包<PackageReferenceInclude="System.Drawing.Common"Version="5.0.3"/>2.添加引用usingSystem.Drawing;usingSystem......