2012-04-27 128 views

回答

15

在我的情況下,API請求完全由澤西處理,因此我可以在ContainerResponseFilter設置響應頭:

<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> 

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中啓用如果你不使用Jersey,我想你可以創建一個類似的servlet響應過濾器。

+0

可以添加一個例子如何在沒有球衣的情況下做到這一點? – Berty 2012-07-02 14:58:42

+1

http://padcom13.blogspot.de/2011/09/cors-filter-for-java-applications.html – Hank 2012-07-04 09:56:59

+0

那麼,對於CXF方法中描述的方法不起作用,因爲來自jax-rs 2.0 API的ContainerRequestFilter確實不從Filter過濾器擴展/實現,因此不能配置爲servlet過濾器。試圖這樣做會導致類拋出異常。 – 2013-05-22 20:51:31

2

這是一個Java EE標準的方式來做到這一點。它與Jersey示例幾乎完全相同,只是使用的庫包(javax)和獲取標頭的方法調用不同(getHeaders)。

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 2015-07-08 01:56:59

1

由於您使用標籤java-ee-6,我相信@Provider不受支持。我用下面的代碼的基礎上,javaee6 tutorial

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

,並選擇跨來源資源共享過濾

Create new Cross-origin filter

+0

如果條目不在上下文菜單中,請選擇「Other ...」,然後通過鍵入「cross」來過濾選項列表。從現在起,您可以按照萊昂納多描述的上下文菜單訪問它。 – 2017-02-02 15:17:06

+0

這個!!!我不知道爲什麼這不是更經常提及。像魅力一樣工作,只需要1秒 – Rombus 2017-07-13 20:33:19