2017-03-10 88 views
2

我正在使用Spring Boot v1.5.1,看起來我對CORS起源的限制不起作用。CORS允許的起源限制在Spring Boot應用程序中不起作用

我的application.properties文件有以下行(ref1ref2)。

endpoints.cors.allowed-origins=http://mydomain.io 

我的REST控制器如下所示。

@RestController 
@CrossOrigin 
@RequestMapping("/api/car") 
public class CarCtrl { 
    @Autowired 
    private CarService carService; 

    @GetMapping 
    public Car get() { 
    return carService.getLatest(); 
    } 
} 

然而,當我在http://localhost:8080/api/car打開一個瀏覽器,輸入我仍然能夠訪問REST端點。

我也嘗試改變我的註釋,如下所示,但這不起作用。

@CrossOrigin("${endpoints.cors.allowed-origins}") 

關於我在做什麼的錯誤?

請注意,我沒有使用WebMvcConfigurerAdapter這樣的post。我真的需要擴展這個類來顯式控制原點嗎?我認爲除了屬性文件設置之外,@CrossOrigin註釋將能夠控制允許的來源(而不是以編程方式進行)。

+0

在執行ajax請求時應用Cors。它不會阻止瀏覽器直接訪問API網址。當您想要應用全局Cors策略時使用'WebMvcConfigurerAdapter','@ CrossOrigin'應該足夠用於單個資源。你爲什麼認爲這行不通?你是如何檢查它的? –

回答

5

但是,當我打開瀏覽器並輸入http://localhost:8080/api/car時,我仍然能夠訪問REST端點。

CORS允許來源設置不會阻止您直接在瀏覽器中打開URL。

瀏覽器僅對運行在使用XHR或Fetch或jQuery $.ajax(…)或任何其他產生跨域請求的Web應用程序中的JavaScript代碼施加CORS限制。

因此CORS不是阻止用戶直接導航到URL的方法,也不是阻止curl或Postman之類的非webapp客戶端或訪問URL的任何方式。

1

將@CrossOrigin(「http://mydomain.io」)中的字符串明確指定爲域。我不'認爲這會起作用@CrossOrigin(「$ {endpoints.cors.allowed-origins}」)。

+0

因此,如果我沒有在註釋中設置值,是否將application.properties文件中的值設置爲適用於所有其餘的控制器?例如用'endpoints.cors.allowed-origins'? –

+0

我不確定,但我認爲它可以在全球範圍內啓用CORS,而且您不必在REST控制器中指定@CrossOrigin。 – imprezzeb

1

至於我,我在我的應用程序中添加了CrossRef Filter。

package com.alexfrndz.filter; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 
import org.springframework.web.filter.GenericFilterBean; 

import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 


@Component 
public class SimpleCORSFilter extends GenericFilterBean { 

/** 
* The Logger for this class. 
*/ 
private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

@Override 
public void doFilter(ServletRequest req, ServletResponse resp, 
        FilterChain chain) throws IOException, ServletException { 

    HttpServletResponse response = (HttpServletResponse) resp; 
    response.setHeader("Access-Control-Allow-Origin", "*"); 
    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type"); 
    //response.setHeader("Access-Control-Allow-Credentials", "true"); 
    chain.doFilter(req, resp); 


    } 

} 
相關問題