2017-03-10 16 views
2

私はSpringブートv1.5.1を使用していますが、CORSの原点に対する私の制限が機能していないようです。CORSの許可されたオリジン制限がSpringブートアプリケーションで動作しない

私のapplication.propertiesファイルには、次の行があります(ref1ref2)。

私のRESTコントローラは次のようになります。私はhttp://localhost:8080/api/carにブラウザと種類を開くとき

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

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

はしかし、私はまだRESTエンドポイントにアクセスできるようにしています。

また、次のように注釈を変更しようとしましたが、これは機能しません。

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

私が間違っていることについてのアイデアはありますか?

WebMvcConfigurerAdapterのように、postを使用していないことに注意してください。明示的に原点をコントロールするために、このクラスを拡張する必要が本当にありますか?私は、プロパティファイルの設定に加えて、@CrossOrigin注釈は、(プログラム的に行う必要はなく)許可された起点を制御できると考えました。

+0

ajaxリクエストを実行するときにCorsが適用されます。ブラウザがAPIのURLに直接アクセスするのを妨げるものではありません。 'WebMvcConfigurerAdapter'は、グローバルCorsポリシーを適用する場合に使用され、' @ CrossOrigin'は単一のリソースに対して十分でなければなりません。なぜそれは動作しないと思いますか?どのようにチェックしましたか? –

答えて

5

ただし、ブラウザを開いてhttp://localhost:8080/api/carと入力すると、まだRESTエンドポイントにアクセスできます。

CORS allowed-originins設定では、ブラウザで直接URLを開くことができません。

ブラウザでは、XHRまたはFetchまたはjQuery $.ajax(…)などを使用するWebアプリケーションで実行されているJavaScriptコードにCORS制限が課されます。

CORSは、ユーザーが直接URLにナビゲートできないようにする手段ではなく、curlやPostmanなどの非Webアプリケーションクライアントや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); 


    } 

} 
関連する問題