2017-07-04 45 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> 
相关问题