本文内容:代码实现 springboot 对 Kaptcha 验证码的集成。
1
效果演示
2
实现
pom.xml 引入依赖
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
创建KaptchaConfig.java 配置类
@Componentpublic class KaptchaConfig {
private final static String CODE_LENGTH = "4"; private final static String SESSION_KEY = "verification_session_key";
@Bean public DefaultKaptcha defaultKaptcha() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 设置边框 properties.setProperty("kaptcha.border", "no"); // 设置边框颜色 properties.setProperty("kaptcha.border.color", "105,179,90"); // 设置字体颜色 properties.setProperty("kaptcha.textproducer.font.color", "blue"); // 设置图片宽度 properties.setProperty("kaptcha.image.width", "173"); // 设置图片高度 properties.setProperty("kaptcha.image.height", "40"); // 设置字体尺寸 properties.setProperty("kaptcha.textproducer.font.size", "32"); // 设置图片样式 properties.setProperty("kaptcha.obscurificator.impl","com.google.code.kaptcha.impl.ShadowGimpy"); // 设置session key properties.setProperty("kaptcha.session.key", SESSION_KEY); // 设置验证码长度 properties.setProperty("kaptcha.textproducer.char.length", CODE_LENGTH); // 设置字体 properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,黑体"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; }}
修改登陆页面 login.html
<body><h3 th:text="${msg}" style="color: red"></h3> <form method="post" action="login"> 用戶:<input type="text" id="userName" name="userName"/><br/> 密碼:<input type="password" id="password" name="password"/><br/> 验证码:<input type="text" name="verifyCode" placeholder="请输入验证码"><br> <a href="#" style="color: blue" onclick="refreshCode()">换一个</a> <img id="verifyCode" src="/hospital/getCode" style="margin-left: 16px"><br> <input type="checkbox" name="rememberMe">记住用户<br> <button type="submit" class="btn btn-primary">登陆</button> </form> <script> function refreshCode() { document.getElementById("verifyCode").setAttribute("src","/hospital/getCode"); }</script></body>
loginController.java 添加获取验证码的方法
/** * 获取验证码 * @param response */ @GetMapping("/getCode") public void getGifCode(HttpServletResponse response, HttpServletRequest request) throws IOException { byte[] verByte = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); try { //生产验证码字符串并保存到session中 String createText = defaultKaptcha.createText(); request.getSession().setAttribute(SHIRO_VERIFY_SESSION,createText); //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中 BufferedImage challenge = defaultKaptcha.createImage(createText); ImageIO.write(challenge,"jpg",jpegOutputStream); } catch (IllegalArgumentException e){ response.sendError(HttpServletResponse.SC_NOT_FOUND); return; } catch (IOException e){ e.printStackTrace(); } //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组 verByte = jpegOutputStream.toByteArray(); response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); ServletOutputStream responseOutputStream = response.getOutputStream(); responseOutputStream.write(verByte); responseOutputStream.flush(); responseOutputStream.close(); }
loginController.java 修改登陆验证的方法
@RequestMapping(value="/login",method = RequestMethod.POST) public String login(String userName,String password,String verifyCode,boolean rememberMe,Model model) { /** * 使用Shiro编写认证操作 *///1.获取Subject Subject subject = SecurityUtils.getSubject(); //2.封装用户数据 UsernamePasswordToken token = new UsernamePasswordToken(userName,password);//3.执行登录方法 // 获取session中的验证码 String verCode = (String) subject.getSession().getAttribute(SHIRO_VERIFY_SESSION); if("".equals(verifyCode)||(!verCode.equals(verifyCode))){ model.addAttribute("msg","验证码错误"); return "login"; } try { System.out.println(rememberMe); token.setRememberMe(rememberMe); subject.login(token); //登录成功,跳转到主页面 return "redirect:/toHome"; } catch (UnknownAccountException e) { //登录失败:用户名不存在 model.addAttribute("msg", "用户名不存在"); return "login"; }catch (IncorrectCredentialsException e) { //登录失败:密码错误 model.addAttribute("msg", "密码错误"); return "login"; } }
在ShiroConfig.java 放行获取验证码的方法
filterMap.put("/getCode","anon");
3
测试
在地址栏输入http://localhost:8080/hospital/login ,跳转到如下的登陆页面:
至此,本文结束。欢迎各位关注我的公众号:暗星涌动。
往期文章: