前言
在網上找到的知識點真的不怎麼全,而且整理的思路也非常的亂,所以就自己整理一下,給大家一個輕鬆。
跨域問題
總共三個文件(改好就可以解決了)
1、MycorsFilter過濾器
這個copy過去就行了,因爲是新添加的。
MyCorsFilter
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class MyCorsFilter extends ZuulFilter {
/**
* 判斷該過濾器是否要被執行
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 過濾器的具體執行邏輯
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest httpRequest = ctx.getRequest();
HttpServletResponse httpResponse = ctx.getResponse();
// Access-Control-Allow-Origin就是我們需要設置的域名
// Access-Control-Allow-Headers跨域允許包含的頭。
// Access-Control-Allow-Methods是允許的請求方式
httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
//允許客戶端發送一個新的請求頭
httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, jwt, verificationjwt");
//允許客戶端處理一個新的響應頭jwt
httpResponse.setHeader("Access-Control-Expose-Headers", "jwt, verificationjwt");
log.info("myCorsFilter進入成功。。。。");
//axios和ajax會發送兩次請求,第一次提交方式爲:option直接返回即可
if("OPTIONS".equals(httpRequest.getMethod())) {
return false;
}
return null;
}
/**
* 過濾器的類型 這裏用pre,代表會再請求被路由之前執行
*
* pre:路由之前
* routing:路由之時
* post: 路由之後
* error:發送錯誤調用
*
*/
@Override
public String filterType() {
return "pre";
}
/**
* 過濾器的執行順序
*/
@Override
public int filterOrder() {
return 2;
}
}
2、zuulConfig
這個之前如果有的話就加上去就行了,沒有就直接copy
import com.scp2p.microservicezuulserver3001.filter.AccessFilter;
import com.scp2p.microservicezuulserver3001.filter.MyCorsFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ZuulConfig {
@Bean
public AccessFilter accessFilter(){
return new AccessFilter();
}
@Bean
public MyCorsFilter myCorsFilter(){
return new MyCorsFilter();
}
}
3、啓動類
這個加上的,看的懂得還是看得懂。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableZuulProxy
public class MicroserviceZuulServer3001Application {
public static void main(String[] args) {
SpringApplication.run(MicroserviceZuulServer3001Application.class, args);
}
/**
*這是跨域配置
* @return
*/
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); // 允許cookies跨域
config.addAllowedOrigin("*");// 允許向該服務器提交請求的URI,*表示全部允許。。這裏儘量限制來源域,比如http://xxxx:8080 ,以降低安全風險。。
config.addAllowedHeader("*");// 允許訪問的頭信息,*表示全部
config.setMaxAge(18000L);// 預檢請求的緩存時間(秒),即在這個時間段裏,對於相同的跨域請求不會再預檢了
config.addAllowedMethod("*");// 允許提交請求的方法,*表示全部允許,也可以單獨設置GET、PUT等
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");// 允許Get的請求方法
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
後記
外面的世界太複雜(●ˇ∀ˇ●)