积微成著 不积跬步,无以至千里

首页   >   web开发   >   Access-Control-Allow-Origin重复跨域问题

Access-Control-Allow-Origin重复跨域问题

之前在备案期间,由于解析不了域名,所以就将域名全部代理到了本地,项目之间涉及到多个域名,碰到了字体文件跨域问题。

以前一直用windows系统,本地nginx配置也很好办的,header中加一个Access-Control-Allow-Origin就好了

location ~ .*\.(eot|ttf|woff|svg|otf|woff2)$ {
    if (!-e $request_filename) {
        proxy_pass http://cdn;
    }
    proxy_redirect off;
    proxy_set_header Host $host;

    add_header Access-Control-Allow-Origin *;
}

但是现在公司配置的mac电脑,使用的是Charles(一个抓包工具,兼代理),这个工具由于不熟悉,不知道如何配置跨域,所以就临时在代码里面加了一个拦截器Interceptor来处理

package com.wolffy.cdn.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 使用本地代理时,在这里处理跨域,线上使用nginx处理跨域
 * Created by SongFei on 2018/9/12.
 */
public class CorsInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setHeader("Access-Control-Allow-Origin", "*");
        // response.setHeader("Access-Control-Allow-Credentials", "true");
        // response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        // response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, " + "X-CSRF-TOKEN");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

}

这里使用过滤器Filter也是可以的,不一定非要拦截器。

本地使用图简单,就直接用 *,如果大家在线上也用代码来处理的话,那可以从请求中解析出指定域名,再放到Access-Control-Allow-Origin响应头中。

等到备案通过之后,代码忘记改回去了,线上访问的时候一直报错“The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.”,错误提示的很好看懂,有多次跨域,但是只有一次是允许的,此时才猛然想起来,代码里面的跨域设置和nginx中的跨域设置重复了Access-Control-Allow-Origin重复跨域

既然原因知道了,那我们直接移除掉一个就行了,我这里选择移除代码中的跨域设置,毕竟这些工作还是让nginx来做比较方便和安全。

QQ群:积微成著官方群(686430774),验证消息:积微成著

站长Q:1347384268(加好友请注明来意)

分享到:

欢迎分享本文,转载请注明出处!

作者:不忘初心

发布时间:2018-09-20

永久地址:http://www.jiweichengzhu.com/article/c916c8dbf011443282a936388301e6e1

相关阅读