Rumah > pangkalan data > Redis > Cara menggunakan Springboot +redis+Kaptcha untuk melaksanakan fungsi kod pengesahan imej

Cara menggunakan Springboot +redis+Kaptcha untuk melaksanakan fungsi kod pengesahan imej

WBOY
Lepaskan: 2023-05-27 15:05:47
ke hadapan
1070 orang telah melayarinya

Latar Belakang

  • Pendaftaran-log masuk-pengubahsuaian kata laluan secara amnya memerlukan penghantaran kod pengesahan, tetapi ia mudah untuk diserang dan dipindahkan secara berniat jahat⽤

  • Apakah SMS -Pengebom E-mel

  • Pengebom SMS ialah kaedah menghantar kod pengesahan pendaftaran SMS tanpa had untuk pelbagai tapak web ke telefon mudah alih dalam kelompok dan kitaran.

  • Kerugian yang diakibatkan oleh syarikat

  • Mesej teks berharga 5 sen Jika ia dileret oleh pencuri, semua orang akan mengira pemberitahuan e-mel secara percuma. Penipuan berskala besar, lebar jalur, sambungan, dll. diduduki, menjadikannya mustahil untuk digunakan seperti biasa

  • Cara menghalang tapak web anda daripada menjadi "pedaging" atau disikat

  • Tambahkan kod pengesahan grafik (pembangun)

  • Hadkan bilangan permintaan IP tunggal (pembangun)

  • Hadkan penghantaran nombor (biasanya disediakan melalui SMS) Dewan Perniagaan)

  • Selalu ada serangan dan pertahanan, tetapi ia hanya meningkatkan kos penyerang, dan ROI tidak berbaloi itu, jadi kami berputus asa

Pengenalan kepada rangka kerja Kaptcha

Alat penjanaan kod pengesahan yang sangat boleh dikonfigurasikan dan praktikal yang disumberkan oleh Google

  • Fon/saiz/warna kod pengesahan

  • Julat kandungan kod pengesahan (nombor, huruf, aksara Cina!)

  • Saiz, jidar, ketebalan jidar dan warna jidar imej kod pengesahan

  • Gaya kod pengesahan (gaya mata ikan, 3D, kabur biasa)

Tambah pergantungan

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

Kelas konfigurasi

/**
 * 图像验证码的配置文件
 * @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;
    }
}
Salin selepas log masuk

Praktikal

Kelas konfigurasi saya

Kelas alat untuk mendapatkan IP akses dan menjana 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;
}
Salin selepas log masuk

Pembangunan antara muka

@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;
}
Salin selepas log masuk

Profil

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
Salin selepas log masuk

Hasil

Cara menggunakan Springboot +redis+Kaptcha untuk melaksanakan fungsi kod pengesahan imej

Atas ialah kandungan terperinci Cara menggunakan Springboot +redis+Kaptcha untuk melaksanakan fungsi kod pengesahan imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan