Heim > Datenbank > Redis > Hauptteil

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

WBOY
Freigeben: 2023-05-27 15:05:47
nach vorne
1056 Leute haben es durchsucht

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>
Nach dem Login kopieren

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;
        }
    }
    Nach dem Login kopieren
  • 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;
    }
    Nach dem Login kopieren

    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;
    }
    Nach dem Login kopieren
  • 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
    Nach dem Login kopieren

    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!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage