2017-08-30 10 views
1

私はAngular 2で開発されたWebアプリケーションと、Springbootで開発されたRest APIを持っています。Webappとモバイルアプリで使用されるSpring API

Mme Michu ---> WebApp (Angular 2 - Known origin) ---> API (Springboot CORS) 

CORSをwebappとAPIの間で設定しても問題なく動作します。ここで

は私CORSFilterが

@Order(Ordered.HIGHEST_PRECEDENCE) 
public class SimpleCORSFilter implements Filter{ 

public SimpleCORSFilter() { 
    super(); 
} 

@Autowired 
private Environment environment; 

private String[] acao; 

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

    acao = environment.getProperty("access-control-allow-origin").split(","); 

    final HttpServletResponse response = (HttpServletResponse) res; 
    final HttpServletRequest request = (HttpServletRequest) req; 

    String origin = request.getHeader("Origin"); 

    response.setHeader("Access-Control-Allow-Origin", Arrays.asList(acao).contains(origin)?origin:""); 

    // without this header jquery.ajax calls returns 401 even after successful login and SSESSIONID being succesfully stored. 
    response.setHeader("Access-Control-Allow-Credentials", "true"); 

    response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); 
    response.setHeader("Access-Control-Max-Age", "3600"); 
    response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Authorization, Origin, Content-Type, Version"); 
    response.setHeader("Access-Control-Expose-Headers", "X-Requested-With, Authorization, Origin, Content-Type"); 


    if(!request.getMethod().equals("OPTIONS")) { 
     chain.doFilter(request, response); 
    } 
} 

@Override 
public void destroy() { 

} 

@Override 
public void init(FilterConfig filterConfig) throws ServletException { 
    acao = environment.getProperty("access-control-allow-origin").split(","); 
} 

}

の実装方法の問題は、私はAPIと対話する(イオンに開発さ)新しいモバイルアプリケーションが必要だということです。

Mme Michu --> MobileApp (Unknown origin) ---> API (Springboot CORS) 

モバイルアプリケーションからの要求がCORSポリシーによってブロックされますか? モバイルアプリの「発信元」がわからないため、モバイルアプリからのリクエストを許可するにはどうすればよいですか?何かアドバイスは大歓迎です

...

答えて

1

起源は、Webアプリケーションのドメインがexample.comの場合、要求は原点としてexample.comを持つことになり、APIへのリクエストを発行するドメインです。送信元が原因でリソースがブロックされた場合、レスポンスをブロックするクライアント側のセキュリティメカニズムです(サーバーはそれを認識していません)。あなたはどのようにイオンが働くのではないが、私はそれがこの種のメカニズムを実装しているとは思わない(プログレッシブウェブアプリケーションの場合を除いて)。

サーバーは許可された発信元を報告する責任があります。 Webブラウザは、要求が許可されたドメインからのみ送信されるように強制する責任があります。

+0

私はあなたの答えを理解していません... CORSフィルタはサーバー側であり、クライアント(モバイルアプリ)がどのようにして元の原点を提供できるのでしょうか? – DavidPi

+0

CORSヘッダーはサーバーによって送信されますが、送信元がサーバーと一致しない場合はブロックしているサーバーではありません。異なる起源でテストを行い、サーバーがクライアント(ユーザーのブラウザー)によってブロックされた応答を送り返していることがわかります。サーバーは許可された起点を報告する責任があります。 Webブラウザは、要求が許可されたドメインからのみ送信されるように強制する責任があります。 –

+1

スーパー!私はそれを試してみましょう! Merci;) – DavidPi

関連する問題