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

SpringBoot跨域問(wèn)題的五種解決方式

 更新時(shí)間:2021年12月08日 09:26:24   作者:跑起來(lái)要帶風(fēng)!  
前后端分離開(kāi)發(fā)中,跨域問(wèn)題是很常見(jiàn)的一種問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于SpringBoot跨域問(wèn)題的五種解決方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、什么是跨域 CORS

當(dāng)一臺(tái)服務(wù)器資源從另一臺(tái)服務(wù)器(不同 的域名或者端口)請(qǐng)求一個(gè)資源或者接口,就會(huì)發(fā)起一個(gè)跨域 HTTP 請(qǐng)求。

舉個(gè)簡(jiǎn)單的例子,從http://aaa.com/index.html,發(fā)送一個(gè) Ajax 請(qǐng)求,請(qǐng)求地址是 http://bbb.com/下面的一個(gè)接口,這就是發(fā)起了一個(gè)跨域請(qǐng)求。在不做任何處理的情況下,這個(gè)跨域請(qǐng)求是無(wú)法被成功請(qǐng)求的

現(xiàn)在很多項(xiàng)目開(kāi)發(fā)都是前后端分離的,前端和后端都是獨(dú)立運(yùn)行的,后端提供json數(shù)據(jù)格式。那么兩邊是不同的ip、端口,跨站點(diǎn)進(jìn)行資源分享,就是跨域。所以前后端分離就肯定有跨域問(wèn)題。

二、為什么會(huì)有跨域問(wèn)題

瀏覽器出于安全考慮,會(huì)限制跨域訪問(wèn),就是不允許跨域請(qǐng)求資源,要求協(xié)議,IP和端口必須都相同,其中有一個(gè)不同就會(huì)產(chǎn)生跨域問(wèn)題,這就是同源策略。

三、有哪些跨域類型

簡(jiǎn)單來(lái)說(shuō),就是協(xié)議、域名(主域或子域)、端口號(hào)有一個(gè)不同就是跨域。

四、解決跨域問(wèn)題的五種方式

1. 添加跨域配置類

* 號(hào)根據(jù)需要修改。

@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //是否發(fā)送 Cookie
        config.setAllowCredentials(true);
        //放行哪些請(qǐng)求方式
        config.addAllowedMethod("*");
        //放行哪些原始請(qǐng)求頭部信息
        config.addAllowedHeader("*");
        //暴露哪些頭部信息
        config.addExposedHeader("*");
        //2. 添加映射路徑
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

2. 重寫(xiě)WebMvcConfigurer

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否發(fā)送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOrigins("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

3. 注解 @CrossOrigin

在控制器(類上)上使用注解 @CrossOrigin,表示該類的所有方法允許跨域

@RestController
@CrossOrigin(origins = "*")
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

在方法上使用注解 @CrossOrigin,表示該方法允許跨域

@RequestMapping("/hello")
@CrossOrigin(origins = "*")
 //@CrossOrigin(value = "http://localhost:8081") //指定具體ip允許跨域
public String hello() {
      return "hello world";
}

4. 自定義過(guò)濾器

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class MyCorsFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain) throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        chain.doFilter(req, res);

    }

    public void init(FilterConfig filterConfig) {}
    public void destroy() {}
}

5. 手動(dòng)設(shè)置響應(yīng)頭

在接口的代碼中添加下面這端代碼。

 response.addHeader("Access-Control-Allow-Origin", "*");
 response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
 response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
 response.addHeader("Access-Control-Max-Age", "1800");//30 min

前后分離的跨域問(wèn)題其他解決方案

Nginx服務(wù)器反向代理

通過(guò)反向代理服務(wù)器監(jiān)聽(tīng)同端口,同域名的訪問(wèn),不同路徑映射到不同的地址,比如,在nginx服務(wù)器中,監(jiān)聽(tīng)同一個(gè)域名和端口,不同路徑轉(zhuǎn)發(fā)到客戶端和服務(wù)器,把不同端口和域名的限制通過(guò)反向代理,來(lái)解決跨域的問(wèn)題。

server {
        listen       80;
        server_name  abc.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location /client { #訪問(wèn)客戶端路徑
            proxy_pass http://localhost:81;
            proxy_redirect default;
        }
        location /apis { #訪問(wèn)服務(wù)器路徑
            rewrite  ^/apis/(.*)$ /$1 break;
            proxy_pass   http://localhost:82;
       }
}

或者直接在Nginx中進(jìn)行配置

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

總結(jié)

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

相關(guān)文章

  • Java中?springcloud.openfeign應(yīng)用案例解析

    Java中?springcloud.openfeign應(yīng)用案例解析

    使用OpenFeign能讓編寫(xiě)Web?Service客戶端更加簡(jiǎn)單,使用時(shí)只需定義服務(wù)接口,然后在上面添加注解,OpenFeign也支持可拔插式的編碼和解碼器,這篇文章主要介紹了Java中?springcloud.openfeign應(yīng)用案例解析,需要的朋友可以參考下
    2024-06-06
  • 基于springmvc之常用注解,操作傳入?yún)?shù)

    基于springmvc之常用注解,操作傳入?yún)?shù)

    這篇文章主要介紹了springmvc之常用注解,操作傳入?yún)?shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • IntelliJ IDEA 創(chuàng)建 Java 項(xiàng)目及創(chuàng)建 Java 文件并運(yùn)行的詳細(xì)步驟

    IntelliJ IDEA 創(chuàng)建 Java 項(xiàng)目及創(chuàng)建 Java 文件并運(yùn)行的詳細(xì)步驟

    這篇文章主要介紹了IntelliJ IDEA 創(chuàng)建 Java 項(xiàng)目及創(chuàng)建 Java 文件并運(yùn)行的詳細(xì)步驟,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java刪除String中指定字符的11種方法匯總

    Java刪除String中指定字符的11種方法匯總

    這篇文章主要給大家介紹了關(guān)于Java刪除String中指定字符的11種方法,在Java中String類提供了許多方法來(lái)處理字符串,其中包括刪除指定字符的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • IDEA:Git stash 暫存分支修改的實(shí)現(xiàn)代碼

    IDEA:Git stash 暫存分支修改的實(shí)現(xiàn)代碼

    這篇文章主要介紹了IDEA:Git stash 暫存分支修改的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Java多線程的實(shí)現(xiàn)方式比較(兩種方式比較)

    Java多線程的實(shí)現(xiàn)方式比較(兩種方式比較)

    Java多線程實(shí)現(xiàn)方式有兩種,第一種是繼承Thread類,第二種是實(shí)現(xiàn)Runnable接口,兩種有很多差異,下面跟著本文一起學(xué)習(xí)吧
    2015-11-11
  • 一篇文章帶你了解Java 中序列化與反序列化

    一篇文章帶你了解Java 中序列化與反序列化

    這篇文章主要介紹了Java 序列化與反序列化(Serialization),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼示例

    SpringBoot+MyBatis-Plus實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離的代碼示例

    在當(dāng)今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫(kù)讀寫(xiě)分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過(guò)將讀操作和寫(xiě)操作分別路由到不同的數(shù)據(jù)庫(kù)節(jié)點(diǎn),可以有效減輕數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離,需要的朋友可以參考下
    2023-11-11
  • 深入理解java中的synchronized關(guān)鍵字

    深入理解java中的synchronized關(guān)鍵字

    這篇文章主要介紹了java中的synchronized關(guān)鍵字,有需要的朋友可以參考一下
    2013-12-12
  • java 中sendredirect()和forward()方法的區(qū)別

    java 中sendredirect()和forward()方法的區(qū)別

    這篇文章主要介紹了java 中sendredirect()和forward()方法的區(qū)別,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

江阴市| 来凤县| 金秀| 奉节县| 新和县| 繁峙县| 江门市| 体育| 南京市| 松潘县| 德钦县| 高陵县| 满洲里市| 柘荣县| 新巴尔虎左旗| 瓦房店市| 文昌市| 沙湾县| 漠河县| 余姚市| 长治县| 惠安县| 沛县| 砚山县| 衢州市| 松桃| 敦煌市| 普定县| 田阳县| 新干县| 绥芬河市| 积石山| 乌鲁木齐县| 上蔡县| 遂昌县| 普格县| 新竹市| 绵竹市| 江源县| 阳信县| 兴和县|