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

Java跨域問題的幾種后端解決方式舉例詳解

 更新時(shí)間:2023年11月07日 09:38:19   作者:earlytrain9653  
跨域,是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript實(shí)施的安全限制,這篇文章主要給大家介紹了關(guān)于Java跨域問題的幾種后端解決方式的相關(guān)資料,需要的朋友可以參考下

一、什么是跨域

跨域指的是:瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,從一個(gè)域名的網(wǎng)頁(yè)去請(qǐng)求另一個(gè)域名的資源時(shí),域名、端口、協(xié)議任一不同,都是跨域??缬蚴怯蔀g覽器的同源策略造成的,是瀏覽器施加的安全限制。a頁(yè)面想獲取b頁(yè)面資源,如果a、b頁(yè)面的協(xié)議、域名、端口、子域名不同,所進(jìn)行的訪問行動(dòng)都是跨域的。

二、常見跨域舉例

當(dāng)前頁(yè)面URL被請(qǐng)求頁(yè)面URL是否跨域原因
http://www.test.com/http://www.test.com/index.html同源 (協(xié)議、域名、端口號(hào)相同)
http://www.test.com/https://www.test.com/index.html跨域協(xié)議不同 (http/https)
http://www.test.com/http://www.baidu.com/跨域域名不同 (test/baidu)
http://www.test.com/http://blog.test.com/跨域域名不同 (www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口號(hào)不同 (8080/7001)

三、Java后端解決方式

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

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")// 攔截所有的請(qǐng)求
            .allowedOrigins("*")// 可跨域的域名,*為所有
            .allowCredentials(true)
            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")// 允許跨域的方法,可以單獨(dú)配置
            .maxAge(3600);
    }
}

2、實(shí)現(xiàn) HandlerInterceptor

創(chuàng)建一個(gè)類實(shí)現(xiàn) HandlerInterceptor 接口,并在 preHandle 方法中設(shè)置響應(yīng)頭以實(shí)現(xiàn)跨域。

@Component
public class CorsInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Access-Control-Allow-Origin", "http://example.com");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        return true;
    }
    // ...
}
```

這將允許來自 http://example.com 的跨域請(qǐng)求訪問應(yīng)用程序中的 API。

3、使用Filter

創(chuàng)建一個(gè)類實(shí)現(xiàn) javax.servlet.Filter 接口,并在 doFilter 方法中設(shè)置響應(yīng)頭以實(shí)現(xiàn)跨域。

@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", "http://example.com");
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(req, res);
    }
    // ...
}
````

這將允許來自 http://example.com 的跨域請(qǐng)求訪問應(yīng)用程序中的 API。

注意:使用 Filter 實(shí)現(xiàn)跨域時(shí),F(xiàn)ilter 會(huì)攔截所有請(qǐng)求,而不僅僅是跨域請(qǐng)求。因此,在設(shè)置響應(yīng)頭時(shí)需要謹(jǐn)慎,避免影響其他請(qǐng)求的正常處理。如果需要更細(xì)粒度的控制,可以考慮使用 @CrossOrigin 注解或攔截器來實(shí)現(xiàn)。

4、使用 @CrossOrigin 注解來實(shí)現(xiàn)

在使用 Spring Boot 實(shí)現(xiàn)跨域時(shí),可以使用 Spring 提供的 @CrossOrigin 注解來配置跨域訪問。具體實(shí)現(xiàn)步驟如下:

(1)在需要實(shí)現(xiàn)跨域的 Controller 類或方法上添加 @CrossOrigin 注解。例如:

@CrossOrigin(origins = "http://example.com")
@RestController
public class MyController {
    // ...
}
```
這將允許來自 http://example.com 的跨域請(qǐng)求訪問 MyController 中的方法。

(2)如果需要允許多個(gè)域名訪問,可以將 origins 參數(shù)設(shè)置為包含所有允許訪問的域名的數(shù)組。例如:

@CrossOrigin(origins = {"http://example1.com", "http://example2.com"})
@RestController
public class MyController {
    // ...
}
```

(3)如果需要允許跨域的 HTTP 方法不止 GET 和 POST,可以使用 methods 參數(shù)指定允許的方法列表。例如:

@CrossOrigin(origins = "http://example.com", methods = {RequestMethod.GET, RequestMethod.POST})
@RestController
public class MyController {
    // ...
}
```

(4)如果需要允許跨域的請(qǐng)求頭不止 Content-Type,可以使用 allowedHeaders 參數(shù)指定允許的請(qǐng)求頭列表。例如:

@CrossOrigin(origins = "http://example.com", allowedHeaders = {"Content-Type", "Authorization"})
@RestController
public class MyController {
    // ...
}
```

(5)如果需要允許發(fā)送身份驗(yàn)證信息,可以使用 allowCredentials 參數(shù)將其設(shè)置為 true。例如:

@CrossOrigin(origins = "http://example.com", allowCredentials = "true")
@RestController
public class MyController {
    // ...
}
```

5、在響應(yīng)頭中添加 Access-Control-Allow-Origin 等字段

(1)在響應(yīng)頭中添加 Access-Control-Allow-Origin 字段,允許特定的域名訪問。例如,以下代碼將允許 http://example.com 的域名訪問 API:

response.setHeader("Access-Control-Allow-Origin", "http://example.com");
```
如果希望允許所有域名訪問 API,可以將值設(shè)置為 *:

(2)如果需要允許多個(gè)域名訪問 API,可以在響應(yīng)頭中添加 Access-Control-Allow-Origin 字段,并將其設(shè)置為包含所有允許訪問的域名的列表。例如:

response.setHeader("Access-Control-Allow-Origin", "http://example1.com, http://example2.com");
```

(3)如果需要允許跨域的 HTTP 方法不止 GET 和 POST,可以在響應(yīng)頭中添加 Access-Control-Allow-Methods 字段,指定允許的方法列表。例如:

response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
```

(4)如果需要允許跨域的請(qǐng)求頭不止 Content-Type,可以在響應(yīng)頭中添加 Access-Control-Allow-Headers 字段,指定允許的請(qǐng)求頭列表。例如:

response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
```

(5)如果使用了帶有身份驗(yàn)證信息的請(qǐng)求,例如帶有 Cookie 的請(qǐng)求,那么需要在響應(yīng)頭中添加 Access-Control-Allow-Credentials 字段,并將其設(shè)置為 true,表示允許發(fā)送身份驗(yàn)證信息。例如:

response.setHeader("Access-Control-Allow-Credentials", "true");
```
最后,需要將這些響應(yīng)頭添加到每個(gè)需要跨域訪問的 API 的響應(yīng)中。

6、使用 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;
   }
}

如果使用了帶有身份驗(yàn)證信息的請(qǐng)求,例如帶有 Cookie 的請(qǐng)求,那么需要將 Access-Control-Allow-Credentials 字段設(shè)置為 true,表示允許發(fā)送身份驗(yàn)證信息。例如:

add_header 'Access-Control-Allow-Credentials' 'true';

如果在 Nginx 的 upstream 中使用了負(fù)載均衡,需要在負(fù)載均衡的服務(wù)器塊中添加以上配置。如果使用了反向代理,也需要在反向代理的服務(wù)器塊中添加以上配置。

7、配置 Gateway 的路由

- id: my_route
  uri: http://localhost:8080
  predicates:
    - Path=/api/**
  filters:
    - RewritePath=/api/(?<segment>.*), /$\{segment}
    - AddResponseHeader=Access-Control-Allow-Origin:http://example.com
    - AddResponseHeader=Access-Control-Allow-Methods:GET, POST, PUT, DELETE
    - AddResponseHeader=Access-Control-Allow-Headers:Content-Type, Authorization
    - AddResponseHeader=Access-Control-Allow-Credentials:true
`````

這將允許來自 http://example.com 的跨域請(qǐng)求訪問 Gateway 中的 API。

如果使用了帶有身份驗(yàn)證信息的請(qǐng)求,例如帶有 Cookie 的請(qǐng)求,那么需要將 Access-Control-Allow-Credentials 字段設(shè)置為 true,表示允許發(fā)送身份驗(yàn)證信息。例如:

- AddResponseHeader=Access-Control-Allow-Credentials:true
`````
最后,需要將這些配置添加到每個(gè)需要跨域訪問的 API 的路由配置中。
需要注意的是,如果在 Gateway 的路由中使用了負(fù)載均衡,需要在負(fù)載均衡的路由配置中添加以上配置。如果使用了反向代理,也需要在反向代理的路由配置中添加以上配置。

總結(jié) 

到此這篇關(guān)于Java跨域問題的幾種后端解決方式的文章就介紹到這了,更多相關(guān)Java跨域問題后端解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

广安市| 绥芬河市| 樟树市| 满城县| 治多县| 嘉禾县| 邯郸市| 无为县| 高陵县| 钟祥市| 寿阳县| 黄浦区| 丰台区| 无锡市| 犍为县| 北碚区| 红安县| 庐江县| 金坛市| 贵德县| 社旗县| 四平市| 左云县| 孝感市| 乌什县| 宁蒗| 瑞昌市| 安康市| 屏南县| 泾阳县| 抚顺县| 剑川县| 武川县| 班戈县| 凤阳县| 沙坪坝区| 黄山市| 靖西县| 安远县| 玉门市| 林甸县|