Springboot
之验证码配置
一、引入依赖
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
二、相关可配置类
public class Constants
{
public final static String KAPTCHA_SESSION_KEY = "KAPTCHA_SESSION_KEY";
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";
public final static String KAPTCHA_BORDER = "kaptcha.border";
public final static String KAPTCHA_BORDER_COLOR = "kaptcha.border.color";
public final static String KAPTCHA_BORDER_THICKNESS = "kaptcha.border.thickness";
public final static String KAPTCHA_NOISE_COLOR = "kaptcha.noise.color";
public final static String KAPTCHA_NOISE_IMPL = "kaptcha.noise.impl";
public final static String KAPTCHA_OBSCURIFICATOR_IMPL = "kaptcha.obscurificator.impl";
public final static String KAPTCHA_PRODUCER_IMPL = "kaptcha.producer.impl";
public final static String KAPTCHA_TEXTPRODUCER_IMPL = "kaptcha.textproducer.impl";
public final static String KAPTCHA_TEXTPRODUCER_CHAR_STRING = "kaptcha.textproducer.char.string";
public final static String KAPTCHA_TEXTPRODUCER_CHAR_LENGTH = "kaptcha.textproducer.char.length";
public final static String KAPTCHA_TEXTPRODUCER_FONT_NAMES = "kaptcha.textproducer.font.names";
public final static String KAPTCHA_TEXTPRODUCER_FONT_COLOR = "kaptcha.textproducer.font.color";
public final static String KAPTCHA_TEXTPRODUCER_FONT_SIZE = "kaptcha.textproducer.font.size";
public final static String KAPTCHA_TEXTPRODUCER_CHAR_SPACE = "kaptcha.textproducer.char.space";
public final static String KAPTCHA_WORDRENDERER_IMPL = "kaptcha.word.impl";
public final static String KAPTCHA_BACKGROUND_IMPL = "kaptcha.background.impl";
public static final String KAPTCHA_BACKGROUND_CLR_FROM = "kaptcha.background.clear.from";
public static final String KAPTCHA_BACKGROUND_CLR_TO = "kaptcha.background.clear.to";
public static final String KAPTCHA_IMAGE_WIDTH = "kaptcha.image.width";
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;
@Component
public class KaptchaConfig {
@Bean
public DefaultKaptcha getDefaultKaptcha() {
DefaultKaptcha kaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty(Constants.KAPTCHA_BORDER, "no");
properties.setProperty(Constants.KAPTCHA_BORDER_COLOR, "105,179,90");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "135");
properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "30");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "24");
properties.setProperty(Constants.KAPTCHA_SESSION_KEY, "kaptchaCode");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "5");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "ABCDEFGHIJKMLNOPQRSTUVWXYZabcdefghijkmlopqrstuvwxyz0123456789");
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial");
properties.setProperty(Constants.KAPTCHA_NOISE_COLOR, "gray");
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;
public class KaptchaServlet extends HttpServlet {
@Autowired
private DefaultKaptcha defaultKaptcha;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
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) {
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;
public class CheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String param = request.getParameter("code");
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;
@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;
@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. 结果
六、感谢关注公众号。