如何在java中的服务器端代码上启用CORS

我们遇到的情况是UI在一台主机上运行,​​并且它正在尝试与另一台主机上可用的资源进行通信。 这里的问题是,UI无法调用资源,因为该资源位于不同的域中,除非服务器启用了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知之甚少。 请建议如何进一步。

对于JavaEE 7应用程序,您需要在ResourceConfig中注册此类,方法是在war中添加以下类。

 @ApplicationPath( "/" ) public class ApplicationConfig extends ResourceConfig { public ApplicationConfig() { register( new CORSFilter() ); } } 

也许您还需要通过添加以下类级别注释来提高Filter的优先级:

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

就我而言,以下是有效的

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

在Jersey中,我使用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中链接,如,

  javax.ws.rs.Application com.service.JerseyApplication  

您必须先在服务器中启用它,请查看下面的网站,了解如何配置服务器(即Tomcat)以启用CORS

https://enable-cors.org/server.html

你需要做两件事:

  1. 如果您的资源受密码保护,则必须在web.xml中允许预检OPTIONS请求在没有凭据的情况下运行,例如:

       application /* OPTIONS   user   
  2. 使用servletfilter来处理预检OPTIONS请求。 对于maven添加此依赖项

      com.thetransactioncompany cors-filter 2.6  

    将filter添加到web.xml:

      CORS com.thetransactioncompany.cors.CORSFilter   CORS /rest/*