1. 程式人生 > >Spring、Spring-Boot、Spring-Security中對CORS(跨域資源共享)的支援

Spring、Spring-Boot、Spring-Security中對CORS(跨域資源共享)的支援

       出於安全原因,瀏覽器禁止AJAX呼叫當前域之外的域的資源。跨源資源共享(CORS)是由大多數瀏覽器實現的W3C規範,允許您指定哪些型別的跨域請求是被授權的,而不是基於IFRAME或JSONP的不安全且功能較差的工作區。

     Spring MVC HandlerMapping提供了對CORS的內建支援。在成功地將請求對映到處理程式之後,HandlerMapping將檢查給定請求和處理程式的CORS配置,並採取進一步的操作。

       為了啟用跨源請求(例如,源頭是存在的,並且與請求的主機不同),您需要有一些顯式宣告的CORS配置。如果沒有找到匹配的CORS配置,則拒絕請求前請求。在簡單和實際的CORS請求的響應中沒有新增CORS頭,因此瀏覽器拒絕它們。

      每個HandlerMapping都可以通過基於URL模式的Cors對映單獨配置。在大多數情況下,應用程式將使用MVC Java config或XML名稱空間來宣告這樣的對映。

     在HandlerMapping級別上的全域性CORS配置可以與更細粒度的、handler級別的CORS配置相結合。例如,帶註解的控制器可以使用類或方法級的@CrossOrigin註解。

@CrossOrigin註解的使用


@RestController
@RequestMapping("/account")
public class AccountController {


    @CrossOrigin
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }


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

預設情況下@CrossOrigin允許:

  • 所有的域。
  • 所有的headers
  • 將控制器方法對映到的所有HTTP方法。
  • maxAge設定為30分鐘。

類級別支援某一特定的域


@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {


    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }


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


類和方法上都使用


@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {


    @CrossOrigin("http://domain2.com")
    @GetMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }


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


Spring JAVA Configuration中 全域性配置


@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {


    @Override
    public void addCorsMappings(CorsRegistry registry) {


        registry.addMapping("/api/**")
            .allowedOrigins("http://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);


        // Add more mappings...
    }
}


在SpringBoot中的應用


package org.niugang.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
 * 
 * @Description:跨域訪問配置
 * @Project:boot-sis 
 * @File:CORSMyConfiguration.java 
 * @Package:org.niugang.config 
 * @Date:2018年7月12日下午10:22:10
 * @author:niugang 
 * @Copyright (c) 2018, [email protected] All Rights Reserved. 
 *
 */
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
//addMapping 跨域所能訪問的路徑
//allowedOrigins:那些域可以訪問,預設為任何域都可以訪問
registry.addMapping("/api/**").allowedOrigins("*");
}
};
}
}


在SpringSecurity中的應用

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


@Override
protected void configure(HttpSecurity http) throws Exception {
http
// by default uses a Bean by the name of corsConfigurationSource  
 //預設配置一個Bean Name為corsConfigurationSource  
.cors().and()
...
}
       //配置那些域可以訪問的我的資源
@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
     configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
      return source;
}
}


配置跨域  程式碼和上面一樣SpringBoot和Spring Security整合應用

package org.niugang.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
 * 
 * @Description:跨域訪問配置
 * @Project:boot-sis 
 * @File:CORSMyConfiguration.java 
 * @Package:org.niugang.config 
 * @Date:2018年7月12日下午10:22:10
 * @author:niugang 
 * @Copyright (c) 2018, [email protected] All Rights Reserved. 
 *
 */
@Configuration
public class CORSConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
//addMapping 跨域所能訪問的路徑
//allowedOrigins:那些域可以訪問,預設為任何域都可以訪問
registry.addMapping("/api/**").allowedOrigins("*");
}
};
}
}

  • 配置Spring Security

                                                                               微信公眾號: 

                                               

                                                                             JAVA程式猿成長之路

                                                       分享學習資源,學習方法,記錄程式設計師生活。

相關推薦

SpringSpring-BootSpring-SecurityCORS資源共享支援

       出於安全原因,瀏覽器禁止AJAX呼叫當前域之外的域的資源。跨源資源共享(CORS)是由大多數瀏覽器實現的W3C規範,允許您指定哪些型別的跨域請求是被授權的,而不是基於IFRAME或JSONP的不安全且功能較差的工作區。      Spring MVC Hand

深入剖析.NETCORECORS資源共享

# 前言 由於現代網際網路的飛速發展,我們在開發現代 Web 應用程式中,經常需要考慮多種型別的客戶端訪問服務的情況;而這種情況放在15年前幾乎是不可想象的,在那個時代,我們更多的是考慮怎麼把網頁快速友好的巢狀到服務程式碼中,經過伺服器渲染後輸出HTML到客戶端,沒有 iOS,沒有 Android,沒有 U

解決 ionic CORS 問題

緣起ionic社群裡的(ionic serve)時的跨域問題,有人在這裡翻譯了一篇文章,洋洋灑灑,從理論到實際,說的都很好。 不過有人在底下的評論裡說的更加到位: 搜尋了一下,果然啊,方便啊 不過還是要說一下在伺服器上的配置,如此能夠做到使ionic當作純web

spring boot 通過CORS實現

一、跨域問題出現的原因    出現跨域問題的原因是同源策略。   同源策略   主要是三同:同協議、同域名、同埠,   同源策略目的 保證使用者資訊保安,防止惡意網站竊取資料。同源策略是必須的,否則cookie可以共享。   同源策略的限制範圍 cookie、localstorage、indexdb

Spring Boot官方指南》47.3 資源共享支援

原文連結 47.3 跨域資源共享支援 跨域資源共享 (CORS)是一個被絕大部分瀏覽器實現的W3C標準,CORS允許你靈活的指定跨域請求是否授權。執行器的MVC服務介面可以通過配置支援這種功能。 跨域資源共享預設是關閉的,只有當endpoints.cors.allowed-origins 屬

Spring boot解決CORS請求(基於spring MVC 4.0以上版本)。

一、前言   昨天晚上臨近下班之前,公司前端同事突然跟我說,他從前端傳送的請求,方法變成了OPTIONS,我看到他的程式碼裡明明也寫著的是POST請求,可是為什麼會變成了OPTIONS請求,而且返回的http狀態碼也是200,但是沒有任何資料的返回,這就表明請求根本沒有進入到

CVPR論文《100+ Times FasterWeighted Median Filter (WMF)》的實現和解析附原始碼。 任意半徑值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理實現及效果 任意半徑值濾波擴充套件至百分比濾波器O(1)時間複雜度演算法的原理實現及

  四年前第一次看到《100+ Times FasterWeighted Median Filter (WMF)》一文時,因為他附帶了原始碼,而且還是CVPR論文,因此,當時也對程式碼進行了一定的整理和解讀,但是當時覺得這個演算法雖然對原始速度有不少的提高,但是還是比較慢。因此,沒有怎麼在意,這幾天有幾位朋友

HTTP(二)資源共享CORS

2.跨域資源共享(CORS) 跨域簡介 當訪問一個資原始檔時,如果從非該資原始檔所在的伺服器不同域名或者埠處進行訪問時,該資源會發起一個跨域請求。 例如,網站A的地址是http://www.domain-a.com ,該網站中HTML頁面通過 img 標籤中的

Web API使用CORS解決暫存

content attribute 註冊 serve color def erro 簡單 style Web API中使用Cros解決跨域   如果兩個頁面的協議,端口和域名都相同,則兩個頁面具有相同的源,註:IE不考慮端口,同源策略不會阻止瀏覽器發送請求,但是它會阻止

JavaScript的jsonp請求

ajax中的jsonp跨域請求,固定格式,然後就可以了。為什麼卻沒有深入的理解過。讀了相關資料,將總結寫到這裡。 何為JSONP? JSONP(JSON width padding)是一種不成文的協議,允許服務端將script tags 返回到客戶端,使用JavaScr

gospring bootvert.x 用CORS解決

go gin 使用github.com/gin-contrib/cors package main import "github.com/gin-gonic/gin" import "github.com/gin-contrib/cors" func main() {

Spring Boot學習筆記之使用Spring Boot建立一個簡單的web專案工具使用IntelliJ IDEA

新建Maven專案 1.File --> New Project --> Maven --> Next 2.填寫專案資訊,完成之後點選Next,然後點選Finish 3.專案建好之後如下圖所示 修改pom檔案中的配置資訊 <?xml version

Spring boot 整合 swagger生成api文件轉換成markdown格式

spring boot 整合 swagger 步驟 1. 匯入jar包 2. 新增配置類 3. 新增介面類 3. 啟動伺服器 4. 訪問UI頁面,可線上測試介面 5. 匯出swagger原始檔 6. 轉換成markdown格式檔案 1,匯入jar包 gradl

Spring Boot Ribbon負載均衡配置的坑避免被ComponentScan掃描

配置 Spring Boot Ribbon負載均衡配置很簡單,網上一搜類似下面: @Configuration public class LoadBalanceConfiguration { @Bean public IRule rule() {

spring boot實戰之CSRF站請求偽造

CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。攻擊通過在授權使用者訪問的頁面中包含連結或者

Spring Security (CORS)資源訪問配置

跨域 class 瀏覽器和服務器 fig w3c xmlhttp nbsp gin ima 1、CORS介紹 CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源(協議 + 域名 + 端口)服務器

Spring Boot使用CORS解決問題

一、跨域問題描述 Web開發經常會遇到跨域問題,解決方案有:jsonp,iframe,CORS等等。 CORS 與 JSONP 相比: 1、 JSONP 只能實現 GET 請求,而 CORS 支援所有型別的 HTTP 請求。 2、 使用 CORS,開發者

Springboot通過cors解決問題解決spring security oath2的/oauth/token問題

在工程裡新增兩個類: CorsConfig.java: 實現全域性過濾器,設定CORS,注意一定要是全域性。網上說多加一個註解(Spring官網)或者加Cors Mapper只能解決自定義介面的跨域,對於spring security oath2的預設介面,例

Laravel 和 Spring Boot 兩個框架比較創業篇二:人工成本

ntb ng- 功能 生產 對象 會有 ram 目的 c++ 前面從開發效率比較了 Laravel 和 Spring Boot兩個框架,見:Laravel 和 Spring Boot 兩個框架比較創業篇(一:開發效率) ,這一篇打算比較一下人工成本。 本文說的人工成本是狹

曹工說Spring Boot原始碼9-- Spring解析xml檔案,到底從中得到了什麼context名稱空間上

寫在前面的話 相關背景及資源: 曹工說Spring Boot原始碼(1)-- Bean Definition到底是什麼,附spring思維導圖分享 曹工說Spring Boot原始碼(2)-- Bean Definition到底是什麼,咱們對著介面,逐個方法講解 曹工說Spring Boot原始碼(3)--