SpringBoot 整合Kaptcha圖形驗證碼


1. pom.xml Maven依賴

<dependency>
<groupId>com.google.code.kaptcha</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>

2. kaptcha配置類

package com.ruhuanxingyun.shiro.demo.config;

import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

/**
* @description: 驗證碼配置類
* @author: ruphie
* @date: Create in 2019/12/16 12:25
* @company: ruhuanxingyun
*/
@Configuration
public class KaptchaConfig {

@Bean
public DefaultKaptcha defaultKaptcha() {
Properties properties = new Properties();
// 圖片邊框,默認有
//properties.setProperty(Constants.KAPTCHA_BORDER, "yes");
// 邊框顏色,默認黑色
//properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "105,179,90");
// 干擾線顏色,默認黑色
//properties.setProperty(Constants.KAPTCHA_NOISE_COLOR, "black");
// 干擾線實現類
// properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.DefaultNoise");
// 文本集合,驗證碼值從此集合中拿
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "23456789abcefghjkmnpqrstuvwxyz");
// 驗證碼長度
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 文本間隔
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "4");
// 字體
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋體,楷體,微軟雅黑");
// 字體顏色,默認黑色
//properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 字體大小
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "28");
// 背景顏色漸變開始色
properties.setProperty(Constants.KAPTCHA_BACKGROUND_CLR_FROM, "196,196,196");
// 背景顏色漸變結束色,默認白色
//properties.setProperty(Constants.KAPTCHA_BACKGROUND_CLR_TO, "white");
// 圖片寬度
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "120");
// 圖片高度
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "35");
// 圖片樣式
properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");


Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);

return defaultKaptcha;
}
}

3. 生成圖形驗證碼

@GetMapping("/kaptcha")
@ApiOperation("/生成圖形驗證碼")
public void kaptcha(HttpServletRequest request,
HttpServletResponse response) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 生成文本驗證碼
String text = defaultKaptcha.createText();
// 獲取唯一性IP標識
String ipAddress = AddressUtils.getIpAddr(request);
redisTemplate.opsForValue().set(RedisConstant.CAPTCHA_PREFIX + ipAddress, text);
BufferedImage bufferedImage = defaultKaptcha.createImage(text);
try {
ImageIO.write(bufferedImage, "jpg", baos);
} catch (IOException e) {
e.printStackTrace();
response.sendError(HttpStatus.NOT_FOUND.value());
return;
}

// 禁止瀏覽器緩存數據
response.setHeader(HttpHeaders.CACHE_CONTROL, "no-store");
response.setHeader(HttpHeaders.PRAGMA, "no-cache");
response.setDateHeader(HttpHeaders.EXPIRES, 0);
response.setContentType("image/jpeg");

// 使用response響應流輸出圖片
ServletOutputStream sos = response.getOutputStream();
sos.write(baos.toByteArray());
sos.flush();
sos.close();
}
package com.ruhuanxingyun.demo.utils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @description: IP地址工具類
 * @author: ruphie
 * @date: Create in 2019/12/23 17:07
 * @company: ruhuanxingyun
 */
public class AddressUtils {

    /**
     * 獲取IP
     *
     * @param request 請求對象
     * @return ipAddress
     */
    public static String getIpAddr(HttpServletRequest request) {
        String ipAddress = request.getHeader("x-forwarded-for");
        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("Proxy-Client-IP");
        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getHeader("WL-Proxy-Client-IP");
        }

        if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
            ipAddress = request.getRemoteAddr();
            if ("127.0.0.1".equals(ipAddress) || "0:0:0:0:0:0:0:1".equals(ipAddress)) {
                //根據網卡取本機配置的IP
                InetAddress inet = null;
                try {
                    inet = InetAddress.getLocalHost();
                } catch (UnknownHostException e) {
                    return null;
                }
                ipAddress = inet.getHostAddress();
            }
        }

        // 對於通過多個代理的情況,第一個IP為客戶端真實IP,多個IP按照','分割,"***.***.***.***".length() = 15
        if (ipAddress != null && ipAddress.length() > 15 && ipAddress.indexOf(',') > 0) {
            ipAddress = ipAddress.substring(0, ipAddress.indexOf(','));
        }

        return ipAddress;
    }

}

 

可參考:springboot使用kaptcha設置圖形驗證碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM