谷歌验证码实现

本文介绍了如何在Java中实现谷歌图形验证码,包括所需的依赖、配置CaptchaConfig以设置验证码生成逻辑,以及在CaptchaController中获取和存储验证码内容到session。此外,还涉及SecurityConfig的配置以放行相关请求,并在AdminServiceImpl中从session中验证验证码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

谷歌验证码实现

google图形验证码 所需的依赖

<!--google图形验证码-->
    <dependency>
      <groupId>com.github.axet</groupId>
      <artifactId>kaptcha</artifactId>
        <version>0.0.9</version>
    </dependency>
CaptchaConfig
/**
 *
 * 验证码配置类
 * @author HaoStar
 * @date 2021/8/19 0019 14:35
 * @param
 * @return
 */
@Configuration
public class CaptchaConfig {
    @Bean
    public DefaultKaptcha defaultKaptcha(){
        //验证码生成器
        DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
        //配置
        Properties properties = new Properties();
        //是否有边框
        properties.setProperty("kaptcha.border", "yes");
        //设置边框颜色
        properties.setProperty("kaptcha.border.color", "105,179,90");
        //边框粗细度,默认为1
        // properties.setProperty("kaptcha.border.thickness","1");
        //验证码
        properties.setProperty("kaptcha.session.key","code");
        //验证码文本字符颜色 默认为黑色
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        //设置字体样式
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
        //字体大小,默认40
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        //验证码文本字符内容范围 默认为abced2345678gfynmnpwx
        // properties.setProperty("kaptcha.textproducer.char.string", "");
        //字符长度,默认为5
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        //字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "4");
        //验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "100");
        //验证码图片高度 默认为40
        properties.setProperty("kaptcha.image.height", "40");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

登录验证码 CaptchaController
1.获取验证码文本内容
2.把验证码内容放到session中
3.根据文本验证码内容创建图形验证码,
4.输出流输出图片,格式为jpg

/**
 *  登录验证码
 *
 * @author HaoStar
 * @date 2021/8/19 0019 14:44
 * @param
 * @return
 */
@RestController
public class CaptchaController {

    @Autowired
    private DefaultKaptcha defaultKaptcha;
    @ApiOperation(value = "登录验证码",produces = "image/jpeg")
    @GetMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response){
        // 定义response输出类型为image/jpeg类型
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");
        //-------------------生成验证码 begin --------------------------
        //获取验证码文本内容
        String text = defaultKaptcha.createText();
        System.out.println("验证码内容:"+text);
        //将验证码内容放入session中
        request.getSession().setAttribute("captcha",text);
        //根据文本验证码内容创建图形验证码,
        BufferedImage image = defaultKaptcha.createImage(text);
        ServletOutputStream outputStream = null;

        try {
            outputStream =  response.getOutputStream();
            //输出流输出图片,格式为jpg
            ImageIO.write(image,"jpg",outputStream);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


        //-------------------生成验证码 end --------------------------
    }
}

SecurityConfig 配置文件中 配置放行请求url “/captcha”

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers(
                "/login",
                "/logout",
                "/css/**",
                "/js/**",
                "/index.html",
                "favicon.ico",
                "/doc.html",
                "/webjars/**",
                "/swagger-resources/**",
                "/v2/api-docs/**",
                "/captcha"

        );
    }

AdminServiceImpl
从session中获取验证码

@Override
    public RespBean login(String username, String password, String code,HttpServletRequest request) {
       String captcha = (String) request.getSession().getAttribute("captcha");
        System.out.println("客户端输入code:"+code);
        System.out.println("session中captcha:"+captcha);
       if (StringUtils.isEmpty(code)||!captcha.equalsIgnoreCase(code)){
          return RespBean.error("验证码输入错误,请重新输入!");
       }
        //登录
       UserDetails userDetails = userDetailsService.loadUserByUsername(username);

        System.out.println("AdminServiceImpl下userDetails值:"+userDetails);
       if(null==userDetails || !passwordEncoder.matches(password,userDetails.getPassword())){
           return RespBean.error("用户名密码不能为空!");
       }
       if(!userDetails.isEnabled()){
           return  RespBean.error("账号被禁用,请联系管理员");
       }
       //把登录的对象放置在全文中,
       //更新security 登录用户对象
        UsernamePasswordAuthenticationToken authenticationToken= new
                //第一个参数就是userDetails,第二个是凭证,也就是密码,为了安全放null,第三个就是权限
                UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
        //然后放在security全局中
       SecurityContextHolder.getContext().setAuthentication(authenticationToken);
       //生成token
      String token = jwtTokenUtil.generateToken(userDetails);
        Map<String,String> map = new HashMap<>();
        map.put("token",token);
        map.put("tokenHead",tokenHead);
        return RespBean.success("登录成功",map);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值