2017-07-04 77 views
1

我們遇到一種情況,UI在一臺主機上運行,​​並且正嘗試與另一臺主機上可用的資源進行通信。這裏的問題是,用戶界面無法調用資源,因爲該資源位於不同的域中,除非服務器啓用了CORS,否則跨域請求將無法工作。如何在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

我們不使用Spring啓動..我們使用的是netty服務器。 –

回答

2

至於我擔心的以下是工作

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"); 

編輯:(對於春季雲Netflix和其它)

@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() { 
    } 
} 
+0

嗨,彼得,謝謝你的回答。其實我已經實現了上面的代碼片段,但是我需要配置這個到任何配置文件 –

+0

嗨,就我而言,我使用的是Spring雲netflix,因此在實現javax的類上添加@Component註釋。 servlet.Filter,我會編輯我的文章。但是添加過濾器的配置取決於您的Web服務器 –

2

對於JavaEE 7應用程序,您需要在ResourceConfig中註冊此類,方法是在戰爭中添加以下類。

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

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

} 

也許你還需要通過添加下面的類級別的註釋,以增加你的過濾器的優先級:

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

在新澤西,我用ResourceConfig類註冊CORSFilter。像,

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> 
相關問題