vue+springboot验证码登录
时间: 2023-09-06 09:08:15 浏览: 269
要实现Vue和Spring Boot的验证码登录,需要以下步骤:
1. 在Vue中创建一个登录页面,包括用户名、密码和验证码输入框,以及一个登录按钮。
2. 在Vue中使用axios或其他HTTP库向后端发送登录请求,包括用户名、密码和验证码。
3. 在Spring Boot中创建一个控制器,用于处理登录请求。在控制器中,可以使用Spring Security提供的AuthenticationManager来验证用户名和密码是否正确,并使用自定义的验证码验证器来验证验证码是否正确。
4. 如果用户名、密码和验证码都正确,则在后端生成一个JWT令牌,并将令牌返回给前端。
5. 在Vue中,如果收到登录成功的响应,则将JWT令牌保存在本地存储中,并将用户重定向到主页。
以下是一个简单的示例:
Vue代码:
```
<template>
<div>
<h1>登录</h1>
<form>
<label>用户名</label>
<input type="text" v-model="username"><br>
<label>密码</label>
<input type="password" v-model="password"><br>
<label>验证码</label>
<input type="text" v-model="captcha"><br>
<img :src="captchaUrl" @click="refreshCaptcha"><br>
<button type="button" @click="login">登录</button>
</form>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
username: '',
password: '',
captcha: '',
captchaUrl: '',
};
},
methods: {
login() {
axios.post('/api/login', {
username: this.username,
password: this.password,
captcha: this.captcha,
}).then(response => {
localStorage.setItem('token', response.data.token);
this.$router.push('/home');
}).catch(error => {
alert(error.response.data.message);
});
},
refreshCaptcha() {
this.captchaUrl = '/api/captcha?' + Math.random();
},
},
mounted() {
this.refreshCaptcha();
},
};
</script>
```
Spring Boot代码:
```
@RestController
@RequestMapping("/api")
public class LoginController {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private CaptchaValidator captchaValidator;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
try {
// 验证验证码
captchaValidator.validate(request.getCaptcha());
// 验证用户名和密码
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
request.getUsername(), request.getPassword());
Authentication authentication = authenticationManager.authenticate(token);
// 生成JWT令牌
String jwtToken = jwtTokenUtil.generateToken(authentication);
return ResponseEntity.ok(new LoginResponse(jwtToken));
} catch (AuthenticationException | CaptchaException e) {
return ResponseEntity.badRequest().body(new ErrorResponse(e.getMessage()));
}
}
@GetMapping("/captcha")
public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 生成验证码图片并返回
Captcha captcha = captchaValidator.generateCaptcha();
String captchaId = captcha.getId();
BufferedImage image = captcha.getImage();
response.setHeader("Cache-Control", "no-cache, no-store");
response.setContentType("image/jpeg");
ImageIO.write(image, "jpeg", response.getOutputStream());
// 将验证码ID保存在Session中
HttpSession session = request.getSession(true);
session.setAttribute("captchaId", captchaId);
}
}
```
阅读全文