Cors过滤localhost和staging url

时间:2015-08-16 14:06:11

标签: java spring http cross-domain cors

我们正在开发一个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)我们允许特定的ip用于“Access-Control-Allow-Headers”(因为“Access-Control-Allow-Credentials”= true需要这样)

3)名为corsMap的地图包含所有客户端网址及其到服务器网址的映射,如下所示:

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

现在我们遇到了一个问题:

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

1 个答案:

答案 0 :(得分: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方法,可以获取一系列列入白名单的网址。

您还可以参考Spring Lemon的源代码了解具体示例。