最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 如何解決跨域問題

 更新時(shí)間:2021年03月01日 16:19:38   作者:雙鬼帶單  
這篇文章主要介紹了Java 如何解決跨域問題,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

引言

我們在開發(fā)過程中經(jīng)常會(huì)遇到前后端分離而導(dǎo)致的跨域問題,導(dǎo)致無法獲取返回結(jié)果??缬蚓拖穹蛛x前端和后端的一道鴻溝,君在這邊,她在那邊,兩兩不能往來.

什么是跨域(CORS)

跨域(CORS)是指不同域名之間相互訪問??缬?,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略所造成的,是瀏覽器對于JavaScript所定義的安全限制策略。

什么情況會(huì)跨域

  • 同一協(xié)議, 如http或https
  • 同一IP地址, 如127.0.0.1
  • 同一端口, 如8080

以上三個(gè)條件中有一個(gè)條件不同就會(huì)產(chǎn)生跨域問題。

解決方案

前端解決方案

  • 使用JSONP方式實(shí)現(xiàn)跨域調(diào)用;
  • 使用NodeJS服務(wù)器做為服務(wù)代理,前端發(fā)起請求到NodeJS服務(wù)器, NodeJS服務(wù)器代理轉(zhuǎn)發(fā)請求到后端服務(wù)器;

后端解決方案

  • nginx反向代理解決跨域
  • 服務(wù)端設(shè)置Response Header(響應(yīng)頭部)的Access-Control-Allow-Origin
  • 在需要跨域訪問的類和方法中設(shè)置允許跨域訪問(如Spring中使用@CrossOrigin注解);
  • 繼承使用Spring Web的CorsFilter(適用于Spring MVC、Spring Boot)
  • 實(shí)現(xiàn)WebMvcConfigurer接口(適用于Spring Boot)

具體方式

一、使用Filter方式進(jìn)行設(shè)置

使用Filter過濾器來過濾服務(wù)請求,向請求端設(shè)置Response Header(響應(yīng)頭部)的Access-Control-Allow-Origin屬性聲明允許跨域訪問。

@WebFilter
public class CorsFilter implements Filter { 

  @Override
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
    HttpServletResponse response = (HttpServletResponse) res; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "*"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    chain.doFilter(req, res); 
  } 
}

二、繼承 HandlerInterceptorAdapter

@Component
public class CrossInterceptor extends HandlerInterceptorAdapter {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    return true;
  }
}

三、實(shí)現(xiàn) WebMvcConfigurer

@Configuration
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
public class AppConfig implements WebMvcConfigurer {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**") // 攔截所有的請求
        .allowedOrigins("http://www.abc.com") // 可跨域的域名,可以為 *
        .allowCredentials(true)
        .allowedMethods("*")  // 允許跨域的方法,可以單獨(dú)配置
        .allowedHeaders("*"); // 允許跨域的請求頭,可以單獨(dú)配置
  }
}

四、使用Nginx配置

location / {
  add_header Access-Control-Allow-Origin *;
  add_header Access-Control-Allow-Headers X-Requested-With;
  add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;

  if ($request_method = 'OPTIONS') {
   return 204;
  }
}

五、使用 @CrossOrgin 注解

如果只是想部分接口跨域,且不想使用配置來管理的話,可以使用這種方式

在Controller使用

@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {

	@GetMapping("/{id}")
	public User get(@PathVariable Long id) {
		
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {

	}
}

在具體接口上使用

@RestController
@RequestMapping("/user")
public class UserController {

	@CrossOrigin
	@GetMapping("/{id}")
	public User get(@PathVariable Long id) {
		
	}

	@DeleteMapping("/{id}")
	public void remove(@PathVariable Long id) {

	}
}

Spring Cloud Gateway 跨域配置

spring: 
 cloud:
  gateway:
   globalcors:
    cors-configurations:
     '[/**]':
      # 允許跨域的源(網(wǎng)站域名/ip),設(shè)置*為全部
      # 允許跨域請求里的head字段,設(shè)置*為全部
      # 允許跨域的method, 默認(rèn)為GET和OPTIONS,設(shè)置*為全部
      allow-credentials: true
      allowed-origins:
       - "http://xb.abc.com"
       - "http://sf.xx.com"
      allowed-headers: "*"
      allowed-methods:
       - OPTIONS
       - GET
       - POST
       - DELETE
       - PUT
       - PATCH
      max-age: 3600

注意: 通過gateway 轉(zhuǎn)發(fā)的其他項(xiàng)目,不要進(jìn)行配置跨域配置

有時(shí)即使配置了也不會(huì)起作用,這時(shí)你可以根據(jù)瀏覽器控制的錯(cuò)誤輸出來查看問題,如果提示是 response header 出現(xiàn)了重復(fù)的 Access-Control-* 請求頭,可以進(jìn)行如下操作

import java.util.ArrayList;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component("corsResponseHeaderFilter")
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {

 @Override
 public int getOrder() {
  // 指定此過濾器位于NettyWriteResponseFilter之后
  // 即待處理完響應(yīng)體后接著處理響應(yīng)頭
  return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
 }

 @Override
 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  return chain.filter(exchange).then(Mono.defer(() -> {
   exchange.getResponse().getHeaders().entrySet().stream()
     .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
     .filter(kv -> (
       kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
         || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)
         || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)
         || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS)
         || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_MAX_AGE)))
     .forEach(kv -> {
      kv.setValue(new ArrayList<String>() {{
       add(kv.getValue().get(0));
      }});
     });
   return chain.filter(exchange);
  }));
 }
}

以上就是Java 如何解決跨域問題的詳細(xì)內(nèi)容,更多關(guān)于Java 解決跨域問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Maven繼承父工程時(shí)的relativePath標(biāo)簽解析用法小結(jié)

    Maven繼承父工程時(shí)的relativePath標(biāo)簽解析用法小結(jié)

    relativePath 的作用是為了找到父級工程的pom.xml,本文主要介紹了Maven繼承父工程時(shí)的relativePath標(biāo)簽解析用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java利用MD5加鹽實(shí)現(xiàn)對密碼進(jìn)行加密處理

    Java利用MD5加鹽實(shí)現(xiàn)對密碼進(jìn)行加密處理

    在開發(fā)的時(shí)候,有一些敏感信息是不能直接通過明白直接保存到數(shù)據(jù)庫的。最經(jīng)典的就是密碼了。如果直接把密碼以明文的形式入庫,不僅會(huì)泄露用戶的隱私,對系統(tǒng)也是極其的不厲。本文就來和大家介紹一下如何對密碼進(jìn)行加密處理,感興趣的可以了解一下
    2023-02-02
  • mybatis中嵌套使用foreach需要注意的坑

    mybatis中嵌套使用foreach需要注意的坑

    在使用MyBatis進(jìn)行數(shù)據(jù)庫操作時(shí),如果需要在一個(gè)大的foreach標(biāo)簽中嵌套另一個(gè)foreach,需要注意內(nèi)層foreach的item屬性不能與外層重復(fù),如果出現(xiàn)重復(fù),會(huì)導(dǎo)致綁定參數(shù)時(shí)找不到正確的參數(shù),從而拋出異常
    2024-09-09
  • Spring Session實(shí)現(xiàn)分布式session的簡單示例

    Spring Session實(shí)現(xiàn)分布式session的簡單示例

    本篇文章主要介紹了Spring Session實(shí)現(xiàn)分布式session的簡單示例,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-05-05
  • Java 棧和隊(duì)列的交互實(shí)現(xiàn)

    Java 棧和隊(duì)列的交互實(shí)現(xiàn)

    棧和隊(duì)列都是常用的數(shù)據(jù)結(jié)構(gòu),本文就來介紹一下Java 棧和隊(duì)列的交互實(shí)現(xiàn),主要包括隊(duì)列模擬實(shí)現(xiàn)棧及棧模擬實(shí)現(xiàn)隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)XML格式與JSON格式互相轉(zhuǎn)換的方法,方法通過實(shí)例代碼給大家介紹的非常詳細(xì),選擇使用哪種格式通常取決于項(xiàng)目的需求和上下文,所以格式轉(zhuǎn)換就成了我們必備的技能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧
    2023-10-10
  • ElasticSearch創(chuàng)建后索引修改數(shù)據(jù)類型方法步驟

    ElasticSearch創(chuàng)建后索引修改數(shù)據(jù)類型方法步驟

    Elasticsearch存儲(chǔ)數(shù)據(jù)之前需要先創(chuàng)建索引,類似于結(jié)構(gòu)型數(shù)據(jù)庫建庫建表,創(chuàng)建索引時(shí)定義了每個(gè)字段的索引方式和數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于ElasticSearch創(chuàng)建后索引修改數(shù)據(jù)類型的方法步驟,需要的朋友可以參考下
    2023-09-09
  • 如何在pom文件中引入本地jar包并打包

    如何在pom文件中引入本地jar包并打包

    在項(xiàng)目中使用本地JAR文件的方法有很多,下面這篇文章主要給大家介紹了關(guān)于如何在pom文件中引入本地jar包并打包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java內(nèi)存溢出實(shí)現(xiàn)原因及解決方案

    Java內(nèi)存溢出實(shí)現(xiàn)原因及解決方案

    這篇文章主要介紹了Java內(nèi)存溢出實(shí)現(xiàn)原因及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java poi實(shí)現(xiàn)Excel多級表頭導(dǎo)出方式(多級表頭,復(fù)雜表頭)

    java poi實(shí)現(xiàn)Excel多級表頭導(dǎo)出方式(多級表頭,復(fù)雜表頭)

    文章介紹了使用javapoi庫實(shí)現(xiàn)Excel多級表頭導(dǎo)出的方法,通過主代碼、合并單元格、設(shè)置表頭單元格寬度、填充數(shù)據(jù)、web下載和提供表頭樣式、內(nèi)容樣式以及標(biāo)題樣式等步驟,作者實(shí)現(xiàn)了最終的效果
    2025-01-01

最新評論

东源县| 星子县| 乐山市| 尤溪县| 翁牛特旗| 青阳县| 芒康县| 泾川县| 神木县| 阆中市| 嘉鱼县| 萝北县| 涞水县| 甘洛县| 华蓥市| 大丰市| 涿州市| 固安县| 佛山市| 新和县| 信丰县| 墨竹工卡县| 民乐县| 出国| 正安县| 文登市| 昌黎县| 花莲县| 锡林郭勒盟| 白河县| 托克逊县| 桃江县| 乌海市| 新河县| 鄯善县| 吴忠市| 白河县| 德安县| 泰兴市| 封开县| 凤城市|