SpringBoot和Vue跨域Session不是同一个怎么解决(不用Redis)

SpringBoot和Vue跨域Session不是同一个怎么解决(不用Redis)

在使用Vue和SpringBoot做前后端分离项目时,会出现以下问题:

  • 前端直接请求数据会出现跨域访问限制的问题。
  • 如果登录的时候我们在Session域中保存了UserLogin,然后为了防止用户直接在不登录的情况下访问主页面,我们还要判断Session域中是否有UserLogin。这个时候,我们会发现访问的Session不是同一个(想知道是不是同一个Session,我们可以调用HttpSession对象的isNew方法判断是不是同一个Session。)

有些人可能在Controller上面加了@CrossOrigin注解来解决上面的第一个数据跨域问题。但是@CrossOrigin注解并不能解决第二个问题,因为第二个问题的主要原因是我们的Cookie并没有跟着一起跨域,这才导致我们的Session在不同的请求下都会创建一个新的Session。

所以,这个问题就很好解决了,我们只需要写一个拦截器,拦截素有的请求,并且让所有的请求都能够处理数据和Cookie的跨域就可以啦。

需要添加的详细代码如下:
FilterConfig.java

package com.example.boot.config;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class FilterConfig implements HandlerInterceptor {
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
    }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)
            throws Exception {
    }

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        //支持跨域请求
        response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "*");
        //支持cookie跨域
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "Authorization,Origin, X-Requested-With, Content-Type, Accept,Access-Token");//Origin, X-Requested-With, Content-Type, Accept,Access-Token
        //如果使用REST风格的话,还需要加上下面这句,允许这些请求方法跨域
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT, OPTIONS");

        return true;
    }
}

SpringMVCConfig.java(注意:我把SpringMVCConfig.java和上面的FilterConfig.java放在同一个包下了,所以这里并不需要导入FilterConfig,切记不要导入spring的FilterConfig

package com.example.boot.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SuppressWarnings("deprecation")
@SpringBootConfiguration
public class SpringMVCConfig extends WebMvcConfigurerAdapter{
    @Autowired
    private FilterConfig filterConfig;

    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(filterConfig).addPathPatterns("/**");
    }
}

然后我们在Vue下面添加这个:

axios.defaults.withCredentials = true

为了防止路人不知道这一句加在哪里,这里给个提示(在你配置响应拦截器的那个页面的上面,如下图所示)
在这里插入图片描述

之后我们就可以去掉Controller上面的@CrossOrigin注解啦(如果有加这个注解的话,当然不删掉也是可以的)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值