栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
        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注解啦(如果有加这个注解的话,当然不删掉也是可以的)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/435044.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号