如何在Java Spring中集成Kaptcha [英] How do integrate kaptcha in java spring

查看:90
本文介绍了如何在Java Spring中集成Kaptcha的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在官方网站 https:// code中将kaptcha集成到java spring中.google.com / p / kaptcha / wiki / SpringUsage 是非常古老的信息。

I need to integrate kaptcha in java spring, on the official website https://code.google.com/p/kaptcha/wiki/SpringUsage is very old information.

推荐答案


  1. 添加maven依赖项:

  1. Add the maven dependency:

<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>


  • 将kaptcha配置添加到application.properties:

  • Add the kaptcha configurations to the application.properties:

    #Kaptcha 
    kaptcha.config.imageWidth=310
    kaptcha.config.imageHeight=55
    kaptcha.config.textProducerCharString=0123456789aAbBcCdDEeFeGgHhIi
    kaptcha.config.textProducerCharLength=6
    kaptcha.config.headerName=KAPTCHA_HEADER
    kaptcha.config.useBorder=no            
    kaptcha.config.textColor=48,101,137
    


  • 使用@ConfigurationProperties拾取配置

  • Pickup the configurations using @ConfigurationProperties

    @Data
    @Component
    @ConfigurationProperties(prefix="kaptcha.config")
    public class KaptchaConfigurations{
    private String imageWidth;
    private String imageHeight; 
    private String textProducerCharString;
    private String textProducerCharLength;
    private String headerName;
    private String useBorder;
    private String backgroundClass;
    private String textColor;
    }
    


  • *如果您是


    1. 声明Producer @Bean:

    1. Declare Producer @Bean:

    @Bean 
    public Producer createKaptchaProducer(KaptchaConfigurations 
    kaptchaConfigurations) {
    DefaultKaptcha kaptcha = new DefaultKaptcha();
    Properties properties = new Properties();
    properties.put(Constants.KAPTCHA_IMAGE_HEIGHT , 
    kaptchaConfigurations.getImageHeight());
    properties.put(Constants.KAPTCHA_IMAGE_WIDTH, 
    kaptchaConfigurations.getImageWidth());
    properties.put(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH , 
    kaptchaConfigurations.getTextProducerCharLength());
    properties.put(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, 
    kaptchaConfigurations.getTextProducerCharString());
    properties.put(Constants.KAPTCHA_BORDER, 
    kaptchaConfigurations.getUseBorder());
    properties.put(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR,
    kaptchaConfigurations.getTextColor());
    properties.put(Constants.KAPTCHA_NOISE_COLOR,
    kaptchaConfigurations.getTextColor());
    kaptcha.setConfig(new Config(properties));
    return kaptcha;
    }
    


  • 创建一个端点以获取生成的验证码并保存验证码文本在会话中:

  • Create an endpoint to get the generated captcha and save the captcha text in the session:

    @GetMapping("/image")
    public void handleRequest(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    response.setDateHeader("Expires", 0);       
    response.setHeader("Cache-Control", 
    "no-store, no-cache, must-        revalidate");     
    response.addHeader("Cache-Control", "post-check=0, pre-check=0");       
    response.setHeader("Pragma", "no-cache");       
    response.setContentType("image/jpeg");
    String capText = captchaProducer.createText();
    request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY,     
    capText);
    
    // create the image with the text
    BufferedImage bi = captchaProducer.createImage(capText);
    
    ServletOutputStream out = response.getOutputStream();
    
    // write the data out
    ImageIO.write(bi, "jpg", out);
    try {
        out.flush();
    } finally {
        out.close();
    }
    }
    


  • 创建一个方面来验证验证码:

  • Create an aspect to validate the captcha:

    @Aspect
    @Component
    public class KaptchaAspect {
    
        private KaptchaConfigurations kaptchaConfigurations;
    
        public KaptchaAspect(KaptchaConfigurations kaptchaConfigurations) {
            this.kaptchaConfigurations = kaptchaConfigurations;
        }
    
        @Before("@annotation(ValidateKaptcha)")
        public void validateKaptcha() throws Throwable {         
             String headerName = this.kaptchaConfigurations.getHeaderName();
             HttpServletRequest request =
             ((ServletRequestAttributes)                                                     
             RequestContextHolder
             .currentRequestAttributes())
             .getRequest();
             String headerValue = request.getHeader(headerName);
             String kaptchaSessionValue =     
             request.getSession()
            .getAttribute(Constants.KAPTCHA_SESSION_KEY)
            .toString();
    
           if(headerValue == null || kaptchaSessionValue == null) {          
               throw new BusinessException();
           }
    
           if(!headerValue.equals(kaptchaSessionValue)) {           
              throw new BusinessException();
           }
        }
    }
    


  • 声明验证注释:

  • Declare the validation annotation:

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ValidateKaptcha {
    }
    


  • 在需要验证验证码的任何端点上使用@ValidateKaptcha:

  • Use the @ValidateKaptcha on top of any endpoint needs to validate the captcha:

    @ValidateKaptcha
    @PostMapping("/forgot-password-by-user-name")
    public ResponseEntity<?> forgotPasswordByUsername(@RequestBody @Valid 
           ForgotPasswordByUsernameInput forgotPasswordByUsernameInput) { 
     ...
    }
    


  • 从客户端传递标题中的kaptcha值,将其命名为KAPTCHA_HEADER。

    这篇关于如何在Java Spring中集成Kaptcha的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆