当前位置:   article > 正文

springboot 项目整合easy-captcha验证码功能

springboot 项目整合easy-captcha验证码功能
效果

1、验证码使用easy-captcha,在pom文件增加依赖
  1. <!-- google 验证码 -->
  2. <dependency>
  3. <groupId>com.github.whvcse</groupId>
  4. <artifactId>easy-captcha</artifactId>
  5. </dependency>
2、增加获取kaptcha的ctrl
  1. package com.*.*.system.controller;
  2. import com.wf.captcha.SpecCaptcha;
  3. import com.wf.captcha.base.Captcha;
  4. import org.springframework.util.StringUtils;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RequestParam;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12. /**
  13. * @Description
  14. * @auther zxf
  15. * @date 29/3/2024 上午 8:49
  16. */
  17. @RestController
  18. @RequestMapping("kaptcha")
  19. public class KaptchaController {
  20. @GetMapping("/getKaptcha")
  21. public void defaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{
  22. httpServletResponse.setHeader("Cache-Control","no-store");
  23. httpServletResponse.setHeader("Pragma","no-cache");
  24. httpServletResponse.setDateHeader("Expires",0);
  25. httpServletResponse.setContentType("image/gif");
  26. //生成验证码对象,三个参数分别是宽、高、位数
  27. SpecCaptcha captcha = new SpecCaptcha(100, 38, 4);
  28. //设置验证码的字符类型为数字和字母混合
  29. captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
  30. // 设置内置字体
  31. captcha.setCharType(Captcha.FONT_1);
  32. //验证码存入session
  33. httpServletRequest.getSession().setAttribute("kaptcha",captcha.text().toLowerCase());
  34. //输出图片流
  35. captcha.out(httpServletResponse.getOutputStream());
  36. }
  37. public String verify(@RequestParam("code") String code, HttpSession session){
  38. if (!StringUtils.hasLength(code)){
  39. return "验证码不能为空";
  40. }
  41. String kaptchaCode = session.getAttribute("kaptcha")+"";
  42. if (!StringUtils.hasLength(kaptchaCode)||!code.toLowerCase().equals(kaptchaCode)){
  43. return "验证码错误";
  44. }
  45. return "验证成功";
  46. }
  47. }
3、前台
  1. <a-form-item>
  2. <a-input
  3. size="large"
  4. style="width: 80%"
  5. placeholder="请输入验证码"
  6. v-decorator="['kaptcha',{rules: [{ required: true, message: '请输入验证码' }], validateTrigger: 'blur'}]" type="text">
  7. <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
  8. </a-input>
  9. <img alt="验证码" style="float: right" width="65px" height="40px" :src="kaptcha" @click="changekaptcha"/>
  10. </a-form-item>
  11. data里配置:
  12. kaptcha: window.location.origin+"/kaptcha/getKaptcha",
  13. 更改验证码方法
  14. changekaptcha(){
  15. this.kaptcha =this.kaptcha+'?d='+new Date().getTime();
  16. }
3.增加filter
  1. package com.*.*.*.*.config;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.gc.common.base.message.Result;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.context.annotation.Configuration;
  6. import javax.servlet.*;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpSession;
  10. import java.io.IOException;
  11. /**
  12. * @Description
  13. * @auther zxf
  14. * @date 1/4/2024 下午 3:05
  15. */
  16. @Slf4j
  17. @Configuration
  18. public class CaptchaFilter implements Filter {
  19. private static final String CODE_ANT_URL = "auth/login";
  20. private static final String CAPTCHA_SESSION_KEY = "kaptcha";
  21. private static final String CAPTCHA_PARAM_NAME = "kaptcha";
  22. //请求路径匹配
  23. @Override
  24. public void init(FilterConfig filterConfig) throws ServletException {
  25. System.out.println("init()......");
  26. }
  27. @Override
  28. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  29. HttpServletRequest request = (HttpServletRequest)servletRequest;
  30. HttpServletResponse response = (HttpServletResponse)servletResponse;
  31. String url = request.getRequestURL().toString();
  32. //判断请求路径是否是登录路径
  33. if(!url.contains(CODE_ANT_URL)){
  34. filterChain.doFilter(request, response);
  35. return;
  36. }
  37. HttpSession session = request.getSession(false);
  38. if (session != null) {
  39. //拿到session中存放的 captcha 属性
  40. String captcha = (String) session.getAttribute(CAPTCHA_SESSION_KEY);
  41. if (captcha == null) {
  42. returnResult(response, "验证码已过期,请重新获取。");
  43. return;
  44. }
  45. //获取输入的验证码信息
  46. String inputCaptcha = request.getParameter(CAPTCHA_PARAM_NAME);
  47. if (inputCaptcha == null || !captcha.equals(inputCaptcha.trim())) {
  48. returnResult(response, "验证码错误,请重新输入。");
  49. return;
  50. }
  51. } else {
  52. returnResult(response, "无法验证验证码,因为HTTP会话不存在");
  53. return;
  54. }
  55. //判断令牌是否存在,如果不存在则返回错误结果
  56. filterChain.doFilter(request,response);
  57. }
  58. private void returnResult(HttpServletResponse response, String s) throws IOException {
  59. Result responseResult = Result.failure(s);
  60. //把Result对象转换为JSON格式字符串
  61. String json = JSONObject.toJSONString(responseResult);
  62. response.setContentType("application/json;charset=utf-8");
  63. //将json字符串返回给页面
  64. response.getWriter().write(json);
  65. }
  66. @Override
  67. public void destroy() {
  68. System.out.println("destroy()......");
  69. }
  70. }

spring security config中设置优先访问filter

  1. @Override
  2. protected void configure(HttpSecurity http) throws Exception {
  3. //增加filter
  4. http.addFilterBefore(new CaptchaFilter(), UsernamePasswordAuthenticationFilter.class);
  5. super.configure(http);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/370489
推荐阅读
相关标签
  

闽ICP备14008679号