前言
感觉前端验证码没有后端的严谨
这里使用java后端获取图片验证码方式(超简单,复制粘贴就可以用)
实现
效果一
随机验证码
效果二
运算验证码
效果三
动态中文,这里的中文会一闪一闪的
还有数字字母验证码、数字字母动态验证码
html中
<style>
/** 验证码*/
.code-img{
width: 120px;
height: 40px;
cursor: pointer;
}
</style>
<body>
<img src="captcha/code" class="code-img" title="看不清,换一张" onclick="refreshCaptcha()">
</body>
<script type="text/javascript">
/**
* ----------------------------------------------------------------------------------
* 刷新验证码
*/
function refreshCaptcha(){
$(".code-img").attr("src", "captcha/code?time="+Math.random());
}
</script>
pom.xml依赖
<!--验证码依赖-->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
java使用方式
package com.modules.controller.sys; // 改为自己的包目录
import com.common.vo.Result;
import com.wf.captcha.ArithmeticCaptcha;
import com.wf.captcha.ChineseGifCaptcha;
import com.wf.captcha.GifCaptcha;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 验证码获取
* @author yyq
*/
@CrossOrigin(origins = "*",maxAge = 3600)// 前端请求发生跨域错误,加入这段处理
@Controller
public class CaptchaController {
private static final String SESSION_KEY = "captcha";
@RequestMapping("captcha/code")
public void code(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 返回随机数验证码
// CaptchaUtil.out(request, response);
// 数字加减乘除
/*ArithmeticCaptcha captcha = new ArithmeticCaptcha(120, 40);// 可自定义宽高(不设置宽高,则按img标签的大小适应)
captcha.setLen(2);// 两位运算*/
// 动态中文验证码
/*ChineseGifCaptcha captcha = new ChineseGifCaptcha();
captcha.setLen(2);// 两位运算*/
// 英文与数字验证码
//SpecCaptcha captcha = new SpecCaptcha();
//英文与数字动态验证码
//GifCaptcha captcha = new GifCaptcha();
// 英文与数字验证码
SpecCaptcha captcha = new SpecCaptcha();
captcha.setLen(4);// 验证字符数
// 结果
String result = captcha.text();
//System.out.println(result);
// 这里可以单独获取base64格式的验证码
//captcha.toBase64();
// 将结果存储到session中(由于有些验证码没存储结果,则需要自己存储,记得要转小写,可参考自带校验方法.ver)
request.getSession().setAttribute(SESSION_KEY, result.toLowerCase());
// 响应到前端
captcha.out(response.getOutputStream());
/**
* 【说明】
*
* 不设置宽度,则按img的宽度来自适应
*
* 其中我们可以设置自定义样式 captcha.set****();
* 有font、type、width、height等
*
*/
}
@RequestMapping("login")
public Result login(HttpServletRequest request, String captcha){
// 先验证账号、密码、验证码是否为空
// 因为生成的时候存储在了session中,我们也可以直接拿值
String code = (String) request.getSession().getAttribute(SESSION_KEY);
//System.out.println(code);
// 对验证码进行验证
if (!CaptchaUtil.ver(captcha, request)) {
return Result.fail("验证码不正确");
}
CaptchaUtil.clear(request); // 清除session中的验证码
// 验证账号、密码
// 此处Result为个人封装返回对象
return Result.success("登录成功");
}
}
注意:记得拦截器/过滤器把验证码接口放行!