2012-04-27 25 views
4

私はGlassFishの最新バージョンを使用しています。応答でAccess-Control-Allow-Originヘッダーを設定して、GlassFishでホストされているAPIをどのドメインからでも呼び出せるようにします。しかし、私はそれを設定する場所を見つけることができません。私の場合はGlassFish:Access-Control-Allow-Originヘッダーの設定方法

答えて

15

は、APIリクエストが排他的ジャージーによって処理され、したがって、私はContainerResponseFilterでレスポンスヘッダを設定することができます。

package my.app; 

import com.sun.jersey.spi.container.ContainerRequest; 
import com.sun.jersey.spi.container.ContainerResponse; 
import com.sun.jersey.spi.container.ContainerResponseFilter; 

public class CrossOriginResourceSharingFilter implements ContainerResponseFilter { 

    @Override 
    public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) { 

     cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "*"); 
     cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true"); 
     cresp.getHttpHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
     cresp.getHttpHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept"); 

     return cresp; 
    } 
} 

フィルタは、web.xmlで有効になります:

<servlet> 
    <servlet-name>Gateway Servlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name> 
     <param-value>my.app.CrossOriginResourceSharingFilter</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Jerseyを使用しない場合は、同様のサーブレット応答フィルタを作成することができます。

+0

をフィルタリングジャージーなしでこれを行う方法について? – Berty

+1

http://padcom13.blogspot.de/2011/09/cors-filter-for-java-applications.html – Hank

+0

jax-rs 2.0 APIのContainerRequestFilterが行うため、CXFではポストに記載されているメソッドは機能しませんフィルタから拡張/実装しないため、サーブレットフィルタとして設定することはできません。そうしようとすると、クラスキャスト例外が発生します。 –

2

これは、Java EEの標準的な方法です。使用されるライブラリパッケージ(javax)とヘッダーを取得するメソッド呼び出し(getHeaders)が異なる点を除き、Jerseyの例とほぼ同じです。

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

@Provider 
public class RestResponseFilter implements ContainerResponseFilter{ 

@Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException{ 
     responseContext.getHeaders().putSingle("Access-Control-Allow-Origin", "*"); 
     responseContext.getHeaders().putSingle("Access-Control-Allow-Credentials", "true"); 
     responseContext.getHeaders().putSingle("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
     responseContext.getHeaders().putSingle("Access-Control-Allow-Headers", "Content-Type, Accept"); 
    } 

} 
+0

glassfish 4.1のweb.xmlはどうですか? – Muka

1

タグjava-ee-6を使用しているため、@Providerはサポートされていません。 、これを行うための最善かつ最も簡単な方法

import java.io.IOException; 
import java.util.logging.Logger; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletResponse; 

@WebFilter(filterName = "AddHeaderFilter", urlPatterns = {"/*"}) 
public class ResponseFilter implements Filter { 

    private final static Logger log = Logger.getLogger(ResponseFilter.class.getName()); 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (response instanceof HttpServletResponse) { 
     log.info("Adding headers"); 
     HttpServletResponse http = (HttpServletResponse) response; 
     http.addHeader("Access-Control-Allow-Origin", "*"); 
     http.addHeader("Access-Control-Allow-Credentials", "true"); 
     http.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); 
    } 
    chain.doFilter(request, response); 
} 
6

Create new in project

クロスオリジンリソース共有を選択するプロジェクトを右クリックして次のとおりです。私はjavaee6 tutorialに基づいて、次のコードを、使用しましたあなたは例を追加することができます

Create new Cross-origin filter

+0

エントリーがコンテキストメニューにない場合は、「Other ...」を選択して、「cross」とタイプしてオプションのリストをフィルターします。これからは、Leonardoの説明に従ってコンテキストメニューからアクセスできます。 –

+0

これ!なぜこれがより頻繁に言及されていないのか分かりません。作品は魅力的で、1秒しかかかりません – Rombus

関連する問題