我们遇到的情况是,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 没有太多了解。 请建议如何进一步进行。
最佳答案
就我而言,以下内容正在工作
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");
编辑:(适用于 spring cloud 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() {
}
}
关于java - 如何在java中的服务器端代码上启用CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905898/