用于 localhost 和暂存 url 的 Cors 过滤器

Posted

技术标签:

【中文标题】用于 localhost 和暂存 url 的 Cors 过滤器【英文标题】:Cors filter for localhost and staging url 【发布时间】:2015-11-09 05:44:05 【问题描述】:

我们正在开发一个 java-spring mvc 项目。 为了让客户团队能够连接到我们的服务,我们创建了一个 CorsFilter:

  @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException,
    IOException 

// populating the header required for CORS

String responseURL = this.corsMap.get(request.getServerName().toString());
response.addHeader(
           "Access-Control-Allow-Origin",
           (responseURL == null ? "https://default.ourCompany.com" : responseURL));

response.addHeader(
           "Access-Control-Allow-Credentials",
           "true");

if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) 
    // CORS "pre-flight" request
    response.addHeader(
               "Access-Control-Allow-Methods",
               "GET, POST, PUT, DELETE");
    response.addHeader(
               "Access-Control-Allow-Headers",
               "X-Requested-With,Origin,Content-Type, Accept");


filterChain.doFilter(
             request,
             response);

注意事项:

1) 我们允许所有 OPTIONS 传入请求。

2) 我们允许“Access-Control-Allow-Headers”使用特定 ip(因为“Access-Control-Allow-Credentials”=true 要求如此)

3) 一个名为 corsMap 的映射包含所有客户端 url 及其到服务器 url 的映射,如下所示:

10.110.0.55->http://localhost
10.110.0.66->https://some.other.url

现在我们有一个问题:

我们想使用来自“http://localhost”和“http://some.other.url”的客户端。我们怎样才能做到这一点? (这里的问题是只允许一个客户端 URL,如果可以从多个 URL 接收客户端请求 - 我们将无法确定允许什么)。

【问题讨论】:

为了清楚起见,您是说您的服务器的单个部署实例可以同时从多个客户端访问,对吧? 是的,其中一些将通过客户端构建机器访问,而其他将通过开发人员 PC (localhost) 访问 客户端构建机器和开发人员的 PC 都不能访问任何部署?如果是这样,那么只拥有一个可以在部署环境中设置的应用程序属性怎么样? 【参考方案1】:

对于跨域请求,请求将具有“Origin”标头,稍后将与“Access-Control-Allow-Origin”响应标头(我们在上述过滤器中提供)匹配。

所以,我认为,编码doFilterInternal 如下应该可以工作:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException,
    IOException 

    String clientURL = request.getHeader("Origin");
    response.addHeader(
           "Access-Control-Allow-Origin",
           isInWhileList(clientURL) ? clientUrl : "https://default.ourCompany.com";
    ...

注意

最新版Spring有a new way配置CORS,里面有一个allowedOrigins方法,可以获取白名单URL数组。

具体例子也可以参考Spring Lemon的源码。

【讨论】:

以上是关于用于 localhost 和暂存 url 的 Cors 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

GCC 扩展 Asm - 了解 clobbers 和暂存寄存器的使用

处理 Azure 暂存疯狂 URL

gitlog和diff区别

WebRequest 奇怪的 NotFound 错误

git 缓存区

Azure 交换部署槽粘性设置不起作用