问题描述
使用nestjs编写一个验证码登录接口,但是无法获取session中的验证码
前端
withCredentials:默认情况下,跨源请求不提供凭据(cookie、HTTP认证及客户端SSL证明等)。通过将withCredentials属性设置为true,可以指定某个请求应该发送凭据。
在使用axios的时候,需要加上withCredentials:true;否则cookie不正常发送
import axios from 'axios';
let instance=axios.create({
timeout:5000,
withCredentials:true
})
instance.interceptors.response.use(response=>{
return response.data||response
})
export default instance;
后端
main.ts中配置如下
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(
session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: false,//确保没有初始化的情况下不保存会话
cookie: { secure: false },
}),
);
await app.listen(3000);
}
bootstrap();
验证码和登录
确保在login前,先先调用了createCaptchaCode
export class loginController {
constructor(private readonly xiaomanService: XiaomanService) {}
@Get('code')
createCaptchaCode(@Req() req,@Res() res){
const captcha = svgCaptcha.create({
size:4,
fontSize:50,
width:100,
height:34,
background:'#cc9966'
})
req.session.youcode=captcha.text;
res.cookie('aa','bb')
res.type('image/svg+xml');
console.log(req.session.youcode)
res.send(captcha.data);
}
@Post('login')
login(@Req() req,@Body() body){
console.log(req.session)
if(req.session.youcode.toLocaleLowerCase()===body?.code.toLocaleLowerCase()){
return {
message:'登录成功'
}
}else{
return {
message:'登录失败'
}
}
}