后台实现验证码
用于登录注册验证
实现思路
1.前端思路
a.一个< input> 标签用于填写验证码
b.一个< img>标签用于展示生成的验证码,src属性值绑定后台生成验证码的方法的访问路径(拼接上系统时间)
c.点击可切换验证码,登录失败后可以自动刷新
d.代码实现
<input id="loginCard" type="text" name="code" lay-verify="code" placeholder="输入验证码" autocomplete="off" class="layui-input cardInput" >
<img id="loginCode" class="layui-input codeInput" onclick="this.src=this.src+'?'" src="/kaptcha">
// 刷新验证码
var url=$("#loginCode").attr("src")+"?s="+ (new Date()).getTime();
$("#loginCode").attr("src",url);
2. 后台思路
使用工具类生成一张验证码图片,把图片上字母放进session中储存,用于登录验证
package com.spb.controller;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.spb.common.KaptchaConfig;
@Controller
public class KaptchaController {
public static final Logger logger = LoggerFactory.getLogger(KaptchaController.class);
/* 获取验证码图片 */
@RequestMapping(path = "/kaptcha", method = RequestMethod.GET)
public void getVerificationCode(HttpServletResponse response, HttpServletRequest request) {
try {
int width = 200;
int height = 69;
BufferedImage verifyImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 生成对应宽高的初始图片
String randomText = KaptchaConfig.drawRandomText(width, height, verifyImg);
// 单独的一个类方法,出于代码复用考虑,进行了封装。
// 功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符
request.getSession().setAttribute("verifyCode", randomText);
response.setContentType("image/png");// 必须设置响应内容类型为图片,否则前台不识别
OutputStream os = response.getOutputStream(); // 获取文件输出流
ImageIO.write(verifyImg, "png", os);// 输出图片流
os.flush();
os.close();// 关闭流
} catch (IOException e) {
this.logger.error(e.getMessage());
e.printStackTrace();
}
}
}