Springboot之驗證碼配置

Springboot之驗證碼配置

一、引入依賴

<!-- 驗證碼 -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

二、相關可配置類

public class Constants
{
    /**
     * 描述: session key
     * 默認值: KAPTCHA_SESSION_KEY
     * 合法值:
     */
	public final static String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";

    /**
     * 描述: session date
     * 默認值: KAPTCHA_SESSION_DATE
     * 合法值:
     */
	public final static String KAPTCHA_SESSION_DATE = "KAPTCHA_SESSION_DATE";

    /**
     * 描述:
     * 默認值:
     * 合法值:
     */
	public final static String KAPTCHA_SESSION_CONFIG_KEY = "kaptcha.session.key";

    /**
     * 描述:
     * 默認值:
     * 合法值:
     */
	public final static String KAPTCHA_SESSION_CONFIG_DATE = "kaptcha.session.date";

    /**
     * 描述: 圖片邊框
     * 默認值: yes
     * 合法值: yes/no
     */
	public final static String KAPTCHA_BORDER = "kaptcha.border";

    /**
     * 描述: 邊框顏色
     * 默認值: black
     * 合法值: r,g,b (and optional alpha) 或者 white,black,blue.
     */
	public final static String KAPTCHA_BORDER_COLOR = "kaptcha.border.color";

    /**
     * 描述: 邊框厚度
     * 默認值:
     * 合法值:
     */
	public final static String KAPTCHA_BORDER_THICKNESS = "kaptcha.border.thickness";

    /**
     * 描述: 干擾 顏色
     * 默認值: black
     * 合法值: r,g,b 或者 white,black,blue.
     */
	public final static String KAPTCHA_NOISE_COLOR = "kaptcha.noise.color";

    /**
     * 描述: 干擾實現類
     * 默認值: com.google.code.kaptcha.impl.DefaultNoise
     * 合法值:
     */
	public final static String KAPTCHA_NOISE_IMPL = "kaptcha.noise.impl";

    /**
     * 描述: 圖片樣式
     * 默認值: 水紋 com.google.code.kaptcha.impl.WaterRipple
     * 合法值: 水紋 com.google.code.kaptcha.impl.WaterRipple
     *        魚眼 com.google.code.kaptcha.impl.FishEyeGimpy
     *        陰影 com.google.code.kaptcha.impl.ShadowGimpy
     */
	public final static String KAPTCHA_OBSCURIFICATOR_IMPL = "kaptcha.obscurificator.impl";

    /**
     * 描述: 圖片實現類
     * 默認值: com.google.code.kaptcha.impl.DefaultKaptcha
     * 合法值:
     */
	public final static String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";

    /**
     * 描述: 文本實現類
     * 默認值: com.google.code.kaptcha.text.impl.DefaultTextCreator
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_IMPL = "kaptcha.textproducer.impl";

    /**
     * 描述: 文本集合,驗證碼值從此集合中獲取
     * 默認值: abcde2345678gfynmnpwx
     * 合法值: 
     */
	public final static String KAPTCHA_TEXTPRODUCER_CHAR_STRING = "kaptcha.textproducer.char.string";

    /**
     * 描述: 驗證碼長度
     * 默認值: 5
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length";

    /**
     * 描述: 字體
     * 默認值: Arial, Courier
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_FONT_NAMES = "kaptcha.textproducer.font.names";

    /**
     * 描述: 字體顏色,合法值: r,g,b 或者 white,black,blue.
     * 默認值: black
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color";

    /**
     * 描述: 字體大小
     * 默認值: 40px
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_FONT_SIZE = "kaptcha.textproducer.font.size";

    /**
     * 描述: 文字間隔
     * 默認值: 2
     * 合法值:
     */
	public final static String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space";
	
    /**
     * 描述: 文字渲染器
     * 默認值: com.google.code.kaptcha.text.impl.DefaultWordRenderer
     * 合法值:
     */
	public final static String KAPTCHA_WORDRENDERER_IMPL = "kaptcha.word.impl";

    /**
     * 描述: 背景實現類
     * 默認值: com.google.code.kaptcha.impl.DefaultBackground
     * 合法值:
     */
	public final static String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";

    /**
     * 描述: 背景顏色漸變,開始顏色
     * 默認值: light grey
     * 合法值:
     */
	public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";

    /**
     * 描述: 背景顏色漸變, 結束顏色
     * 默認值: white
     * 合法值:
     */
	public static final String KAPTCHA_BACKGROUND_CLR_TO = "kaptcha.background.clear.to";

    /**
     * 描述: 圖片寬
     * 默認值: 200
     * 合法值:
     */
	public static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width";

    /**
     * 描述: 圖片高
     * 默認值: 50
     * 合法值:
     */
	public static final String KAPTCHA_IMAGE_HEIGHT = "kaptcha.image.height";
}

三、配置驗證碼配置器

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.stereotype.Component;

import java.util.Properties;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName CodeConfig.java
 * @Email [email protected]
 * @Description 驗證碼配置器
 * @createTime 2019年10月13日 - 14:20
 */
@Component
public class KaptchaConfig {

    @Bean
    public DefaultKaptcha getDefaultKaptcha() {
        DefaultKaptcha kaptcha = new DefaultKaptcha();
        Properties properties = new Properties();

        /**
         * kaptcha.border 是否有圖片邊框
         */
        properties.setProperty(Constants.KAPTCHA_BORDER, "no");

        /**
         * kaptcha.border.color 邊框顏色
         */
        properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "105,179,90");

        /**
         * kaptcha.textproducer.font.color 字體顏色
         */
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");

        /**
         * kaptcha.image.width 圖片寬
         */
        properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "135");

        /**
         * kaptcha.image.height 圖片高
         */
        properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "30");

        /**
         * kaptcha.textproducer.font.size 字體大小
         */
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "24");

        /**
         * kaptcha.session.key session key值
         */
        properties.setProperty(Constants.KAPTCHA_SESSION_KEY, "kaptchaCode");

        /**
         * kaptcha.textproducer.char.length 驗證碼長度
         */
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "5");

        /**
         * kaptcha.textproducer.char.string 使用那些字符生成驗證碼
         */
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "ABCDEFGHIJKMLNOPQRSTUVWXYZabcdefghijkmlopqrstuvwxyz0123456789");

        /**
         * kaptcha.textproducer.font.names 使用哪些字體
         */
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial");

        /**
         * kaptcha.noise.color 干擾線顏色
         */
        properties.setProperty(Constants.KAPTCHA_NOISE_COLOR, "gray");

        /**
         * kaptcha.obscurificator.impl 圖片樣式陰影
         * WaterRipple: 爲圖像添加水波紋效果
         * ShadowGimpy: 爲圖像上的文字添加陰影和兩個噪點
         */
        properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        kaptcha.setConfig(config);
        return kaptcha;
    }
    
}

四、實現方法

4.1. 驗證碼獲取:
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import org.springframework.beans.factory.annotation.Autowired;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName KaptchaServlet.java
 * @Email [email protected]
 * @Description 獲取驗證碼Servlet
 * @createTime 2019年10月13日 - 14:52
 */
public class KaptchaServlet extends HttpServlet {

    @Autowired
    private DefaultKaptcha defaultKaptcha;


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            // step 生產驗證碼字符串並保存到session中
            String code = defaultKaptcha.createText();
            System.out.println("產生的Code:" + code);
            req.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
            BufferedImage image = defaultKaptcha.createImage(code);
            ImageIO.write(image, "jpg", outputStream);
            byte[] bytes = outputStream.toByteArray();
            resp.setHeader("Cache-Control", "no-store");
            resp.setHeader("Pragma", "no-cache");
            resp.setDateHeader("Expires", 0);
            resp.setContentType("image/jpeg");
            ServletOutputStream servletOutputStream = resp.getOutputStream();
            servletOutputStream.write(bytes);
            servletOutputStream.flush();
            servletOutputStream.close();
        } catch (Exception e) {
            // step 出錯的話將跳轉到錯誤頁面
            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
    }
}
4.2. 驗證碼驗證
import com.google.code.kaptcha.Constants;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName CheckFilter.java
 * @Email [email protected]
 * @Description 檢測驗證碼 servlet
 * @createTime 2019年10月13日 - 15:15
 */
public class CheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // step 獲取參數的中驗證碼
        String param = request.getParameter("code");
        // step 獲取session中的驗證碼
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        String sessionValue = (String) httpServletRequest.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        if (StringUtils.isEmpty(param) || StringUtils.isEmpty(sessionValue) || sessionValue.equals(param)) {
            chain.doFilter(request, response);
            return;
        }
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND, "驗證碼錯誤");
    }
}
4.3. 註冊到Spring容器
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 墨龍吟
 * @version 1.0.0
 * @ClassName WebServlet.java
 * @Email [email protected]
 * @Description servlet註冊器
 * @createTime 2019年10月13日 - 15:37
 */
@Configuration
public class WebServlet {


    @Bean
    public CheckFilter getCheckFilter() { return new CheckFilter(); }


    @Bean
    public KaptchaServlet getKaptchaServlet() { return new KaptchaServlet(); }


    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        ServletRegistrationBean servlet = new ServletRegistrationBean();
        servlet.setServlet(getKaptchaServlet());
        servlet.addUrlMappings("/user/code");
        return servlet;
    }


    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filter = new FilterRegistrationBean();
        filter.setFilter(getCheckFilter());
        filter.addUrlPatterns("/user/login");
        return filter;
    }

}

五、測試

5.1. 登錄攔截器
import com.google.code.kaptcha.Constants;
import com.login.test.entity.vo.LoginEntity;
import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 墨龍吟
 * @since 2019-10-13
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/page")
    public String page(){
        return "login";
    }

    @PostMapping("/login")
    @ResponseBody
    public Map<String, String> login(LoginEntity login, HttpServletRequest request) {
        String attribute = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        System.out.println(attribute);
        System.out.println(login);
        return null;
    }
    
}
5.2. 頁面配置
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
<div>
    <form action="/user/login" method="post">
        <div>
            <label>賬號</label><input name="username" value=""/>
        </div>
        <div>
            <label>密碼</label><input name="password" value=""/>
        </div>
        <div>
            <input name="code" value=""><img src="/user/code" alt="">
        </div>
        <div>
            <button type="submit">登錄</button>
            <button type="reset">取消</button>
        </div>
    </form>
</div>
</body>
</html>
5.3. 結果

六、感謝關注公衆號。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章