用于 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 过滤器的主要内容,如果未能解决你的问题,请参考以下文章