2017-07-04 23 views
1

UIが1つのホストで実行されており、別のホストで使用可能なリソースと通信しようとしている状況があります。ここでの問題は、リソースが別のドメインに存在し、サーバーがCORSが有効になっていない限り、ドメイン間の要求が機能しないため、UIがリソースを呼び出すことができないことです。javaのサーバー側コードでCORSを有効にする方法

サーバCORSを有効にするため、以下の変更を行いました。

import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerResponseContext; 
import javax.ws.rs.container.ContainerResponseFilter; 
import javax.ws.rs.ext.Provider; 
import java.io.IOException; 

@Provider 
public class CORSFilter implements ContainerResponseFilter { 

    @Override 
    public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException 
    { 
     response.getHeaders().add("Access-Control-Allow-Origin", "*"); 
     response.getHeaders().add("Access-Control-Allow-Headers","origin, content-type, accept, authorization"); 
     response.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
     response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); 
    } 
} 

ただし、設定ファイル(web.xml)がないので、このクラスをマップ/設定する必要があるのはわかりません。 サーバー側でCORSを有効にすることに関する知識があまりありません。 さらに進めてください。

+0

これをリンクして、あなたは春のブートを使用していますか? –

+0

どのアプリケーションサーバーを使用していますか?これは余分な構成を必要とせずに動作するはずです。 – assylias

+0

私たちは春のブートを使用していません..我々はネットサーバーを使用しています。 –

答えて

2

を有効にする(すなわち、Tomcatを)サーバーを構成する方法を確認するには、以下のウェブサイトをチェックし、最初のサーバーでそれを有効にする必要があります以下の作業をしている

response.getHeaders().add("Access-Control-Allow-Origin", "*"); 
response.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); 
response.getHeaders().add("Access-Control-Allow-Credentials", "true"); 
response.getHeaders().add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS,HEAD"); 

編集:

@Component 
public class HeadersFilter implements Filter { 
    @Override 
    public void init(FilterConfig fc) throws ServletException { 
    } 
    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain fc) throws IOException, ServletException { 
     if(servletResponse instanceof HttpServletResponse){ 
      HttpServletResponse response = (HttpServletResponse) servletResponse; 
      // here add the headers 
     } 
     fc.doFilter(servletRequest, servletResponse); 
    } 
    @Override 
    public void destroy() { 
    } 
} 
(春の雲Netflixのと、おそらく他の人のために)
+0

こんにちはピーター、答えをありがとう。実際に私は上記のスニペットを実装しましたが、これを任意の設定ファイルに設定する必要がありますか? –

+0

こんにちは、私は春のクラウドnetflixを使用しているので、javaxを実装するクラスの@Componentアノテーションを追加します。フィルタ、私は私の投稿を編集します。しかし、フィルタを追加する設定は、あなたのWebサーバーによって異なります –

2

JavaEE 7 Appの場合、次のクラスを戦争に追加することによって、このクラスをResourceConfigに登録する必要があります。

@ApplicationPath("/") 
public class ApplicationConfig 
    extends ResourceConfig { 

    public ApplicationConfig() { 
     register(new CORSFilter()); 
    } 

} 

たぶん、あなたはまた、次のクラスレベルの注釈を追加することで、フィルターの優先順位を上げる必要があります。ジャージーで

@Provider 
@Priority(Priorities.HEADER_DECORATOR) 
public class CORSFilter implements ContainerResponseFilter { 
... 
} 
1

、私はCORSFilterを登録するにはResourceConfigのクラスを使用します。同様に、

import org.glassfish.jersey.jackson.JacksonFeature; 
import org.glassfish.jersey.media.multipart.MultiPartFeature; 
import org.glassfish.jersey.server.ResourceConfig; 

public class JerseyApplication extends ResourceConfig { 
    public JerseyApplication() { 
     register(CORSFilter.class); 
    } 
} 

`

と、などのweb.xmlに

<init-param> 
      <param-name>javax.ws.rs.Application</param-name> 
      <param-value>com.service.JerseyApplication</param-value> 
     </init-param> 
関連する問題