欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot 如何解決cross跨域請求的問題

 更新時(shí)間:2021年10月13日 08:42:11   作者:jwolf2  
這篇文章主要介紹了springboot 如何解決cross跨域請求的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot 解決cross跨域請求

1.使用ajax發(fā)送跨域請求接口時(shí)

接口能正常接收到請求并響應(yīng),但是無法正常展示響應(yīng)數(shù)據(jù)。跨域請求時(shí)會(huì)在有一個(gè)特別的請求頭origin(請求來源)。

瀏覽器認(rèn)為這是不安全的。需要在被跨域請求的那個(gè)接口,響應(yīng)時(shí)加上加上幾個(gè)響應(yīng)頭讓瀏覽器允許跨域請求的響應(yīng)數(shù)據(jù)展示。

springboot準(zhǔn)備了一個(gè)過濾器來實(shí)現(xiàn)這個(gè)操作。(如下:8081有個(gè)ajax請求8888的接口,需要在8888加上過濾器)

2.在被跨域請求的一方配置

一個(gè)CrosFilter過濾器到spring里即可

 @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("http://localhost:8081"); // 允許的域名白名單,可以*
        corsConfiguration.addAllowedHeader("*"); // 允許任何頭
        corsConfiguration.addAllowedMethod(HttpMethod.POST); // 允許哪些類型請求,可以*
        corsConfiguration.addExposedHeader("my-header");//自定義請求頭
        corsConfiguration.setAllowCredentials(true);//是否允許攜帶cookie
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/sys/generator/list", corsConfiguration); // 哪些path的接口可以被跨域請求
        source.registerCorsConfiguration("/sys/generator/code", corsConfiguration);
        return new CorsFilter(source);
    }

3.再次測試

響應(yīng)頭主要多了這些,也能正常接收到響應(yīng)數(shù)據(jù)了

4.對于只有個(gè)別需要開放跨域請求的接口可以這樣玩

@CrossOrigin的參數(shù)跟CrosFilter參數(shù)設(shè)置過濾器一致。

5.其它解決跨域請求的常用方法

使用Nginx反向代理 或前端不跨域請求,后端專門開放一個(gè)API接口供前端調(diào)用,接口以httpClient請求數(shù)據(jù)

Spring解決cross domain

Spring4:

在requestMapping中使用注解。 @CrossOrigin(origins = “http://localhost:9000”)

全局實(shí)現(xiàn) .定義類繼承WebMvcConfigurerAdapter

public class CorsConfigurerAdapter extends WebMvcConfigurerAdapter{ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/*").allowedOrigins("*"); } } 

將該類注入到容器中:

<bean class="com.tmall.wireless.angel.web.config.CorsConfigurerAdapter"></bean>

Spring3舊版本:

在org.springframework.web.servlet.DispatcherServlet.doDispatch中會(huì)根據(jù)根據(jù)request來獲取HandlerExecutionChain,SpringMVC在獲取常規(guī)的處理器后會(huì)檢查是否為跨域請求,如果是則替換原有的實(shí)例。

@Override
public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
 Object handler = getHandlerInternal(request);
 if (handler == null) { handler = getDefaultHandler(); } if (handler == null) { return null; } // Bean name or resolved handler? if (handler instanceof String) { String handlerName = (String) handler; handler = getApplicationContext().getBean(handlerName); } HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request); if (CorsUtils.isCorsRequest(request)) { CorsConfiguration globalConfig = this.corsConfigSource.getCorsConfiguration(request); CorsConfiguration handlerConfig = getCorsConfiguration(handler, request); CorsConfiguration config = (globalConfig != null ? globalConfig.combine(handlerConfig) : handlerConfig); executionChain = getCorsHandlerExecutionChain(request, executionChain, config); } return executionChain; } 

檢查的方法也很簡單,即檢查請求頭中是否有origin字段

public static boolean isCorsRequest(HttpServletRequest request) { return (request.getHeader(HttpHeaders.ORIGIN) != null); } 

請求接著會(huì)交由 HttpRequestHandlerAdapter.handle來處理,根據(jù)handle不同,處理不同的邏輯。前面根據(jù)請求頭判斷是一個(gè)跨域請求,獲取到的Handler為PreFlightHandler,其實(shí)現(xiàn)為:

@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { corsProcessor.processRequest(this.config, request, response); } 

繼續(xù)跟進(jìn)

@Override
public boolean processRequest(CorsConfiguration config, HttpServletRequest request, HttpServletResponse response)
  throws IOException {
 if (!CorsUtils.isCorsRequest(request)) {
  return true; } ServletServerHttpResponse serverResponse = new ServletServerHttpResponse(response); ServletServerHttpRequest serverRequest = new ServletServerHttpRequest(request); if (WebUtils.isSameOrigin(serverRequest)) { logger.debug("Skip CORS processing, request is a same-origin one"); return true; } if (responseHasCors(serverResponse)) { logger.debug("Skip CORS processing, response already contains \"Access-Control-Allow-Origin\" header"); return true; } boolean preFlightRequest = CorsUtils.isPreFlightRequest(request); if (config == null) { if (preFlightRequest) { rejectRequest(serverResponse); return false; } else { return true; } } return handleInternal(serverRequest, serverResponse, config, preFlightRequest); } 

此方法首先會(huì)檢查是否為跨域請求,如果不是則直接返回,接著檢查是否同一個(gè)域下,或者response頭里是否具有Access-Control-Allow-Origin字段或者request里是否具有Access-Control-Request-Method。

如果滿足判斷條件,則拒絕這個(gè)請求。

由此我們知道,可以通過在檢查之前設(shè)置response的Access-Control-Allow-Origin頭來通過檢查。我們在攔截器的preHandle的處理。加入如下代碼:

response.setHeader("Access-Control-Allow-Origin", "*"); 

此時(shí)瀏覽器中OPTIONS請求返回200。但是依然報(bào)錯(cuò):

Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.

我們注意到:在request的請求頭里有Access-Control-Request-Headers:accept, content-type,但是這個(gè)請求頭的中沒有,此時(shí)瀏覽器沒有據(jù)需發(fā)送請求。嘗試在response中加入:

response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

執(zhí)行成功:

Object {userId: 123, userName: “adminUpdate-wangdachui”}

至此:我們通過分析原理使SpringMVC實(shí)現(xiàn)跨域,原有實(shí)現(xiàn)以及客戶端代碼不需要任何改動(dòng)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC 限流的示例代碼

    SpringMVC 限流的示例代碼

    這篇文章主要介紹了SpringMVC 限流的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Springboot跨域處理的多種方式小結(jié)

    Springboot跨域處理的多種方式小結(jié)

    當(dāng)一臺(tái)服務(wù)器資源從另一臺(tái)服務(wù)器(不同 的域名或者端口)請求一個(gè)資源或者接口,就會(huì)發(fā)起一個(gè)跨域 HTTP 請求,這篇文章主要介紹了Springboot跨域處理的多種方式小結(jié),需要的朋友可以參考下
    2023-11-11
  • Scala文件操作示例代碼講解

    Scala文件操作示例代碼講解

    本文章向大家介紹Scala 學(xué)習(xí)筆記之文件操作,主要內(nèi)容包括其使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2023-04-04
  • Java8 lambda表達(dá)式2種常用方法代碼解析

    Java8 lambda表達(dá)式2種常用方法代碼解析

    這篇文章主要介紹了Java8 lambda表達(dá)式2種常用方法代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java判斷字符串是否有逗號(hào)的方法

    java判斷字符串是否有逗號(hào)的方法

    下面小編就為大家?guī)硪黄猨ava判斷字符串是否有逗號(hào)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • 解析Java中的默認(rèn)方法

    解析Java中的默認(rèn)方法

    這篇文章主要介紹了Java中的默認(rèn)方法,包括繼承和調(diào)用等Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07
  • java8 LocalDate 使用詳解

    java8 LocalDate 使用詳解

    這篇文章主要介紹了java8 LocalDate 使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Idea中使用Git的流程

    Idea中使用Git的流程

    這篇文章主要介紹了Idea中使用Git的流程,git是目前流行的分布式版本管理系統(tǒng)。本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • java導(dǎo)出json格式文件的示例代碼

    java導(dǎo)出json格式文件的示例代碼

    本篇文章主要介紹了java導(dǎo)出json格式文件的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor

    Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor

    這篇文章主要介紹了Spring注解驅(qū)動(dòng)擴(kuò)展原理BeanFactoryPostProcessor,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評論