踩坑记录搭建SpringCloud项目时,使用vue把存在本地的token发送到后端,经过gateway网关出现的跨域问题
Posted Code_BinBin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩坑记录搭建SpringCloud项目时,使用vue把存在本地的token发送到后端,经过gateway网关出现的跨域问题相关的知识,希望对你有一定的参考价值。
下学期就要大四了,本人现在在南通实训,本来学校是打算去中山的,但是中山出现了疫情,所以我们就去了南通,我们知道南通在江苏,现在江苏也爆发了疫情。。。
本来疫情没有爆发的时候,我们是在教室上课的,现在疫情爆发了,就在寝室里面上网课。。没错,我们现在就在寝室上网课,教ssm什么的,我也没怎么听,我就想那就趁着这段时间把毕业设计做完,早点答辩完,早点去实习。
我的毕业设计是自己拟题的,就打算把之前自己做的论坛拆分成微服务,然后用上最近学的一些东西,比如设计模式,mongodb什么的,然后我在验证token的时候就出现了一个大问题,我一开始是这么做的。
在浏览器存好token
在vue的main.js里面写一段代码,当检查到本地有token的时候就把token放到请求头里面
if (window.localStorage.getItem("token")) {
// Axios.defaults.headers.common["Authorization"] = window.localStorage.getItem("token")
Axios.defaults.headers.common["token"] = window.localStorage.getItem("token")
}
然后在gatewey的模块下面写好过滤器,我这里只是想测试一下是否能获取到token,所以没有写业务逻辑
package com.znb.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;
@Configuration
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("进入自定义的filter");
String token = exchange.getRequest().getHeaders().getFirst("token");
String requestUrl = exchange.getRequest().getPath().toString();
System.out.println(token);
System.out.println(requestUrl);
if(JudUrl(requestUrl)){
log.info("访问路径是"+requestUrl+"此路径不需要判断token");
return chain.filter(exchange);
}else {
log.info("非法用户,拒绝访问!!!");
return exchange.getResponse().setComplete();
}
}
@Override
public int getOrder() { //filter 数字越小filter越先执行
return -1; //-1 最先执行
}
/**
* 过滤地址
* @param requestUrl
* @return
*/
public boolean JudUrl(String requestUrl){
if (requestUrl.contains("/user/findblogbypage")
||requestUrl.contains("/user/findblogbyblogtypeid")
){
return true;
}else {
return false;
}
}
}
然后发出请求,报错
这个错误我搞了很久,首先是在gateway的配置文件下面写好跨域的配置,但是完全没有用,然后我又开始写各种config,但是好像也没有用,一直是跨域问题,后面我一想,我好像在user模块的usercontroller里面写了一个跨域注释@CrossOrigin(origins = “*”,maxAge = 3600),我记得,这个会影响到网关的配置,于是我重新写了一config,然后把CrossOrigin给注释掉,配置文件如下
package com.znb.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;
/**
* created with IDEA.
*
* @Author:wqz
* @Date:2020-01-09
* @Description:Mult_AdPlatform
*/
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter(){
CorsConfiguration config=new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
//设置预检请求的缓存时间(秒),在这个时间段里,对于相同的跨域请求不会再预检了
config.setMaxAge(18000L);
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**",config);
return new CorsWebFilter(source);
}
}
然后次试一下,问题解决了,这个bug也不是多难的bug,但是也搞了我很多时间,说到底还是基础不牢固吧,还是继续加油吧,现在疫情期间还是要好好搞学习,好了,准备睡觉了。
以上是关于踩坑记录搭建SpringCloud项目时,使用vue把存在本地的token发送到后端,经过gateway网关出现的跨域问题的主要内容,如果未能解决你的问题,请参考以下文章
踩坑记录搭建SpringCloud项目时,使用vue把存在本地的token发送到后端,经过gateway网关出现的跨域问题
踩坑记录搭建SpringCloud项目时,使用vue把存在本地的token发送到后端,经过gateway网关出现的跨域问题
深入浅出SpringCloud原理及实战「SpringCloud-Alibaba系列」微服务模式搭建系统基础架构实战指南及版本规划踩坑分析