java如何写验证码,来吧,看这里

27 篇文章 1 订阅

package com.qianfeng.nanny.controller;

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

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

/**

  • Servlet implementation class CodeServlet
    */
    @WebServlet("/CodeServlet.do")
    public class CodeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    //宽、高、字体大小、字符、颜色
    private static final int WIDTH = 120;
    private static final int HEIGHT =60;
    private static final int FONT_SIZE =25;
    private static final String CHARS = “QWERTYUIOPASDFGHJKLZXCVBNM0123456789”;
    private static final Color[] COLORS = {Color.BLACK,Color.RED,Color.BLUE,Color.YELLOW,Color.WHITE,Color.gray};

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //创建内存图片
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
    //获得绘图对象
    Graphics g = image.getGraphics();
    //设置颜色
    g.setColor(Color.GREEN);
    //设置字体
    g.setFont(new Font(“宋体”,Font.PLAIN,FONT_SIZE));
    //填充矩形
    g.fillRect(0, 0, WIDTH, HEIGHT);
    //随机数
    Random random = new Random();
    StringBuilder strb = new StringBuilder();
    for(int i =0;i<4;i++){
    //随机数作为下标
    int index = random.nextInt(CHARS.length());
    char c = CHARS.charAt(index);
    //连接字符
    strb.append©;
    g.setColor(COLORS[random.nextInt(COLORS.length)]);
    //字符水平绘制到图片上
    g.drawString(String.valueOf©, 20 + i * FONT_SIZE, 30);
    //随机线条
    g.setColor(COLORS[random.nextInt(COLORS.length)]);
    g.drawLine(random.nextInt(WIDTH), random.nextInt(HEIGHT),
    random.nextInt(WIDTH),random.nextInt(HEIGHT));

     }
     //验证码保存到SESSION里面,传到LoginServlet
     request.getSession().setAttribute("code", strb.toString());
     //通过Servlet的输出流,把图片传送到浏览器上
     ImageIO.write(image, "PNG", response.getOutputStream());
    

    }

    /**

    • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
      */
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      // TODO Auto-generated method stub
      doGet(request, response);
      }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中短信验证码防止刷库的代码通常会结合一些策略,如频率限制、滑动验证码验证码有效期等。这里提供一个简单的示例,展示了如何使用Spring Boot和JWT(JSON Web Tokens)实现基本的防止刷操作: ```java import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.concurrent.RateLimiter; @Component public class SmsCodeService { @Value("${sms.code.limit:5}") // 每分钟发送验证码次数限制 private int limit; private final RateLimiter rateLimiter = RateLimiter.create(limit / 60); // 使用令牌桶算法 private final long jwtExpiresInSecs = 60; // 验证码有效时间,秒为单位 public void sendSmsCode(String phoneNumber) { if (!rateLimiter.tryAcquire()) { // 如果超过限频,返回false throw new IllegalStateException("Too many SMS requests. Please try again later."); } // 发送验证码... // 生成并返回JWT,附带手机号和过期时间 String jwt = generateJwt(phoneNumber, jwtExpiresInSecs); // 用户可以通过JWT获取验证码,注意存储JWT时要加上安全措施 } private String generateJwt(String phoneNumber, long expiresInSecs) { // 使用JWT库(如jjwt)创建JWT,包含手机号和过期时间 // 示例: // Map<String, Object> claims = new HashMap<>(); // claims.put("phoneNumber", phoneNumber); // claims.put("exp", System.currentTimeMillis() + (expiresInSecs * 1000)); // String jwt = JWT.create().withClaims(claims).signWith(SignatureAlgorithm.HS256, "your-secret-key").toString(); // 返回生成的JWT } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值