Vue中POST请求无法获得后端Session的值

在使用Vue和SpringBoot进行前后端分离开发时,涉及到请求跨域的问题。

看了一些教程后在后端编写了WebMvc的配置类:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    /**
     * 配置跨域,允许localhost:8080访问
    */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedHeaders("*")
                .allowedMethods("*")				
                .maxAge(1800)
                .allowedOrigins("http://localhost:8080");
    }
}

前端则使用axios进行网络请求。这里封装了一个post请求。

import axios from 'axios'

const baseURL = 'http://localhost:8081'

export function postData(url, config) {
  const instance = axios.create({
    baseURL,
    timeout: 5000 //5秒
  }) 
  //响应拦截器,只把返回结果中的data返回
  instance.interceptors.response.use(
    res => {
      return res.data
    }, 
    err => {
      console.log(err)
  })
  return  instance.post(url,config)
}

这样子便可以进行跨域请求了。

但是,当后端响应一个get请求,往session中保存了一些数据;然后前端再往后端发送一个post请求,请求处理时想要取出刚才保存在session中的数据时却取出了null,震惊。

比如在用户登录这个场景中,前端在渲染登录页面时以get方式向后端发送了一个获取验证码的请求。

<img :src="vcUrl" @click="updateVerifyCode" alt="">
vcUrl: 'http://localhost:8081/verifyCode?time='+new Date()

SpringBoot后端的controller中响应这个请求,并把验证码保存在了session中。

    @GetMapping("/verifyCode")
    public void verifyCode(HttpSession session, HttpServletResponse resp) throws IOException {
        //生成验证码和验证码图片
        VerificationCode code = new VerificationCode();
        BufferedImage image = code.getImage();
        String text = code.getText();
        //将验证码存入session
        session.setAttribute("verify_code", text);
        //System.out.println(session.getAttribute("verify_code"));
        VerificationCode.output(image,resp.getOutputStream());
        System.out.println("[验证码]:"+text);
    }

然后用户便填写登录表单,提交到后端;首先进行校验的便是验证码,便理所应当地取出刚才存进session的验证码进行比对。

postData('/login', this.loginForm).then(resp => {
	//省略成功回调
})
	@PostMapping("/login")
    public SysResult loginHandler(@RequestBody JSONObject object, HttpSession session) {
        //取出参数
        String email = object.getString("email");
        String password = object.getString("password");
        String code = object.getString("code");
        //验证验证码
        if(code != session.getAttribute("verify_code")){
            return SysResult.error("验证码错误");
        }
        User user = userService.login(email, password);
        //验证用户信息
        if(user == null){
           return SysResult.error("用户或密码错误");
        }
		//省略。。。
        return SysResult.ok("登录成功", userDto);
    }

然后session中的值取出是null !!

极度疑惑,便又写了一个controller,这次是用get方式,

    @GetMapping("/hello")
    public SysResult hello(HttpSession session){
        String verify_code = (String) session.getAttribute("verify_code");
        return SysResult.ok("ok",verify_code);
    }

居然取到了!!!为何会出现这种情况呢?百思不得其解。

于是在网上疯狂冲浪,然而也没有得到答案,在浏览那些个网页时,虽是没有遇到和我一般问题的人,不过我却发现神通广大的网友们在解决其他一些跨域问题的时候,不仅会在SpringBoot中配置跨域,axios也会配置。

于是乎,我本着玄学解决bug的原则,配置了一下axios的全局配置。说来也不多,就一句:

axios.defaults.withCredentials = true

重新运行程序,发送请求,定睛一看控制台,

妙啊
( ̄_, ̄ )妙啊~

今天又玄学解决了一个问题,心情舒畅。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue和Flask都是非常流行的Web开发框架。在结合使用时,要注意如何处理会话(Session)的问题。 在Vue前端应用,可以使用Vue插件vue-session来处理会话。该插件提供了一个简单的API,可以在Vue组件方便地读和写入Session数据。 在Flask后端应用,可以使用Flask-Session扩展来处理会话。该扩展提供了一个简单的API,可以在Flask路由函数方便地读和写入Session数据。 具体实现步骤如下: 1. 在Vue安装vue-session插件,并在Vue应用的入口文件引入和使用该插件。 2. 在Flask安装Flask-Session扩展,并在Flask应用的初始化代码配置Session存储方式和Session密钥。 3. 在Flask路由函数使用session对象读和写入Session数据。 例如,在Flask定义一个路由函数,用于处理用户登录请求。在该函数,可以使用session对象保存用户登录状态: ```python from flask import Flask, request, session app = Flask(__name__) app.secret_key = 'your_secret_key' @app.route('/login', methods=['POST']) def login(): username = request.form.get('username') password = request.form.get('password') if username == 'admin' and password == '123456': session['user'] = username return 'Login success' else: return 'Login failed' ``` 在Vue定义一个组件,用于处理用户登录表单。在该组件,可以使用vue-session插件保存用户登录状态: ```javascript <template> <form @submit.prevent="login"> <input v-model="username" type="text" placeholder="Username"> <input v-model="password" type="password" placeholder="Password"> <button type="submit">Login</button> </form> </template> <script> import VueSession from 'vue-session' export default { name: 'LoginForm', data() { return { username: '', password: '' } }, methods: { login() { axios.post('/login', { username: this.username, password: this.password }) .then(response => { this.$session.set('user', this.username) alert(response.data) }) .catch(error => { alert(error.response.data) }) } } } </script> ``` 在以上示例,当用户成功登录时,Flask将会话数据保存在服务器端的Session;而Vue将会话数据保存在客户端的浏览器。这样,在用户使用网站的过程Vue和Flask之间就可以通过Session数据来实现身份认证和权限控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值