springcloud+zuul網關解決跨域問題

前言

在網上找到的知識點真的不怎麼全,而且整理的思路也非常的亂,所以就自己整理一下,給大家一個輕鬆。

跨域問題

總共三個文件(改好就可以解決了)
在這裏插入圖片描述

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);
    }


}

在這裏插入圖片描述

後記

外面的世界太複雜(●ˇ∀ˇ●)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章