如何在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
你需要做两件事:
-
如果您的资源受密码保护,则必须在web.xml中允许预检OPTIONS请求在没有凭据的情况下运行,例如:
application /* OPTIONS user -
使用servletfilter来处理预检OPTIONS请求。 对于maven添加此依赖项
com.thetransactioncompany cors-filter 2.6 将filter添加到web.xml:
CORS com.thetransactioncompany.cors.CORSFilter CORS /rest/*