(1)错误描述:这是在做前后端分离项目跨域时候遇到的,错误的大致意思是没有Access-Control-Allow-Origin 这个头。

Access to XMLHttpRequest at 'http://***.***.**.com/**/**?fromDate=&toDate=&currentPage=1&pageSize=100' 
from origin 'http://beta.***.com' has been blocked by CORS policy:
 No 'Access-Control-Allow-Origin' header is present on the requested resource.

(2)问题解决:需要在filter里面把这个头设置进去:

  response.setHeader("Access-Control-Allow-Origin", currentOrigin);

后台filter完整代码:

@Slf4j
@WebFilter(urlPatterns = {"/*"}, filterName = "corsFilter")
public class CorsFilter implements Filter {
    private static final Logger logger = LoggerFactory.getLogger(IsvSearchController.class);

    private String allowOrigin = "http://***.**.com,http://***.**.com:8080,http://***.**.com";

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        logger.info("doFilter start ...");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        if (StringUtils.isNotEmpty(allowOrigin)) {
            List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));
            if (!CollectionUtils.isEmpty(allowOriginList)) {
                String currentOrigin = request.getHeader("Origin");
                if (allowOriginList.contains(currentOrigin)) {
                    response.setHeader("Access-Control-Allow-Origin", currentOrigin);
                }
            }
        }
        response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "content-Type");
        if (HttpMethod.OPTIONS.name().equalsIgnoreCase(request.getMethod()) &&/*options 请求返回允许跨域的头*/
                request.getHeader(HttpHeaders.ORIGIN) != null) {
            logger.info("doFilter options request");
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐