Heim >Datenbank >Redis >So verwenden Sie Springboot +redis+Kaptcha, um die Bildverifizierungscodefunktion zu implementieren

So verwenden Sie Springboot +redis+Kaptcha, um die Bildverifizierungscodefunktion zu implementieren

WBOY
WBOYnach vorne
2023-05-27 15:05:471081Durchsuche

Hintergrund

  • Registrierung-Login-Änderung des Passworts erfordert im Allgemeinen das Senden eines Bestätigungscodes, kann aber leicht angegriffen und böswillig übertragen werden⽤

  • Was ist SMS-E-Mail-Bomber?

  • Der mobile SMS-Bomber ist ein Batch und Zyklus des unbegrenzten Sendens an Mobiltelefone. So registrieren Sie Bestätigungscode-SMS für verschiedene Websites.

  • Die durch das Unternehmen verursachten Verluste

  • Eine SMS kostet 5 Cent, wenn sie von einem großen Dieb geklaut wird, können Sie die kostenlose E-Mail-Benachrichtigung jedoch selbst berechnen , die Bandbreite, die Verbindung usw. werden belegt, was dazu führt, dass sie nicht normal verwendet werden kann

  • Wie kann verhindert werden, dass Ihre Website zum „Broiler“ wird oder gebürstet wird?

  • Grafikverifizierungscode hinzufügen (Entwickler)

  • Begrenzen Sie die Anzahl einzelner IP-Anfragen (Entwickler)

  • Beschränken Sie das Senden von Nummern (allgemeine SMS-Anbieter werden dies tun)

  • Es gibt immer Angriff und Verteidigung, aber es erhöht nur die Kosten für den Angreifer. und der ROI lohnt sich nicht, also haben wir aufgegeben.

Einführung in das Kaptcha-Framework Umfang des Inhalts des Bestätigungscodes (Zahlen, Buchstaben, chinesische Schriftzeichen!)

Abhängigkeit hinzufügen

<!--kaptcha依赖包-->
<dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>kaptcha-spring-bootstarter</artifactId>
 <version>1.0.0</version>
 </dependency>

Konfigurationsklasse
    /**
     * 图像验证码的配置文件
     * @author : look-word
     * @date : 2022-01-28 17:10
     **/
    @Configuration
    public class CaptchaConfig {
        /**
         * 验证码配置
         * Kaptcha配置类名
         *
         * @return
         */
        @Bean
        @Qualifier("captchaProducer")
        public DefaultKaptcha kaptcha() {
            DefaultKaptcha kaptcha = new DefaultKaptcha();
            Properties properties = new Properties();
            //验证码个数
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
            //字体间隔
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE,"8");
            //⼲扰线颜⾊
    
            //⼲扰实现类
            properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
            //图⽚样式
            properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL,
                    "com.google.code.kaptcha.impl.WaterRipple");
            //⽂字来源
            properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789");
            Config config = new Config(properties);
            kaptcha.setConfig(config);
            return kaptcha;
        }
    }
  • Tatsächlicher Kampf

    Meine Konfigurationsklasse
  • Holen Sie sich die Tool-Klasse für den Zugriff auf IP und die Generierung von MD5

    public class CommonUtil {
        /**
         * 获取ip
         * @param request
         * @return
         */
        public static String
        getIpAddr(HttpServletRequest request) {
            String ipAddress = null;
            try {
                ipAddress = request.getHeader("xforwarded-for");
                if (ipAddress == null ||
                        ipAddress.length() == 0 ||
                        "unknown".equalsIgnoreCase(ipAddress)) {
                    ipAddress =
                            request.getHeader("Proxy-Client-IP");
                }
                            request.getHeader("WL-Proxy-Client-IP");
                            request.getRemoteAddr();
                    if
                    (ipAddress.equals("127.0.0.1")) {
                        // 根据⽹卡取本机配置的IP
                        InetAddress inet = null;
                        try {
                            inet =
                                    InetAddress.getLocalHost();
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                        }
                        ipAddress =
                                inet.getHostAddress();
                    }
                // 对于通过多个代理的情况,第⼀个IP为客户端真实IP,多个IP按照&#39;,&#39;分割
                if (ipAddress != null &&
                        ipAddress.length() > 15) {
                    // "***.***.***.***".length()
                    // = 15
                    if (ipAddress.indexOf(",") > 0)
                    {
                                ipAddress.substring(0, ipAddress.indexOf(","));
            } catch (Exception e) {
                ipAddress="";
            }
            return ipAddress;
        }
        public static String MD5(String data) {
                java.security.MessageDigest md =
                        MessageDigest.getInstance("MD5");
                byte[] array =
                        md.digest(data.getBytes("UTF-8"));
                StringBuilder sb = new
                        StringBuilder();
                for (byte item : array) {
    
                    sb.append(Integer.toHexString((item & 0xFF) |
                            0x100).substring(1, 3));
                return sb.toString().toUpperCase();
            } catch (Exception exception) {
            return null;
    }

    Schnittstellenentwicklung
  • @RestController
    @RequestMapping("/api/v1/captcha")
    public class CaptchaController {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        
        private Producer producer;
        @RequestMapping("get_captcha")
        public void getCaptcha(HttpServletRequest request, HttpServletResponse response){
            String captchaText = producer.createText();
            String key = getCaptchaKey(request);
            // 十分钟过期
            stringRedisTemplate.opsForValue().set(key,captchaText,10, TimeUnit.MINUTES);
            BufferedImage image = producer.createImage(captchaText);
            ServletOutputStream outputStream=null;
            try {
                outputStream= response.getOutputStream();
                ImageIO.write(image,"jpg",outputStream);
                outputStream.flush();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        /**
         * 生成redis验证码模块的key
         * @param request
         * @return
         */
        private String getCaptchaKey(HttpServletRequest request){
            String ipAddr = CommonUtil.getIpAddr(request);
            // 请求头
            String userAgent=request.getHeader("user-Agent");
            String key="user_service:captcha:"+CommonUtil.MD5(ipAddr+userAgent);
            return key;
    }
  • Configuration.-Datei

    server:
      port: 8080
    spring:
      redis:
        host: redis锁在的ip
        password: redis的密码
        port: 端口号
        lettuce:
          pool:
            # 连接池最⼤连接数(使⽤负值表示没有限制)
            max-idle: 10
            # 连接池中的最⼤空闲连接
            max-active: 10
            # 连接池中的最⼩空闲连接
            min-idle: 0
            # 连接池最⼤阻塞等待时间(使⽤负值表示没有限制)
            max-wait: -1ms

    Re Ergebnisse

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Springboot +redis+Kaptcha, um die Bildverifizierungscodefunktion zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen