这里我们使用 开源的AJ-Captcha行为验证码,包含滑动拼图、文字点选两种方式。
参考官方文档和开源页面,使用比较简单,但是有几个坑
@success="'success'"要把单引号去掉,:mode="'pop'"、:captchaType="'blockPuzzle'"要保留单引号
axios.defaults.baseURL = "http://127.0.0.1/api"
也可以用constants.js设置全局变量
aj.captcha.jigsaw=classpath:static/images/jigsaw
aj.captcha.pic-click=classpath:static/images/pic-click
success(params){
// params 返回的二次验证参数, 和登录参数一起回传给登录接口,方便后台进行二次验证
//captchaVerification是必传参数
this.captcha = params.captchaVerification
//假设用axios发起post登录请求
this.$http.post("/user/login",
{ //请求体
username:"xing",
password:"1234",
},
{
params:{captcha:this.form.captcha,},//网址携带请求参数
}
)
.then((response)=>{
if(response.data.code === 0){//登录成功
this.$message({
message: '登录成功',
type: 'success',
});
localStorage.setItem("user",JSON.stringify(response.data.data));//保存用户信息
this.$router.push("/");
}
else{
this.$message.error("用户名或密码错误,请重试!!!");
}
})
.catch((error)=>{
//未接受到response的网络传输等错误
console.log(error);
});
},
login登录方法要校验验证码通过,才执行登录逻辑。代码中CommonResult返回结果类、CustomException自定义异常类和Jwt之前文章实现过,请自行搜索。Jwt实现登录鉴权,视频链接。
@PostMapping("/user/login")
public CommonResult<Object> login(@RequestBody User user,@RequestParam String captcha) {
//必传参数:captchaVO.captchaVerification
//验证码的判断逻辑
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaVerification(captcha);
ResponseModel response = captchaService.verification(captchaVO);
if(response.isSuccess() == false){
//验证码校验失败,返回信息告诉前端,或抛出异常
throw new CustomException(Integer.parseInt(response.getRepCode()), response.getRepMsg());
}
//验证码通过,使用登录逻辑
user = userService.findByUsernameAndPassword(user);
if (user == null) {
return CommonResult.failed(001, Message.createMessage("用户名或密码错误!!!"));
} else {
//生成用户对应的Token
String token = JwtTokenUtils.genToken(user.getId().toString(), user.getPassword());
user.setToken(token);
//不传输密码
user.setPassword("");
return CommonResult.success(user);
}
}