我使用过滤器来检查授权承载令牌是否有效。尽管如此,我还是认为用户代理(firefox,chrome ...)在创建" real"之前试图请求CORS OPTIONS请求。请求。
因此,我的过滤器拦截了此OPTIONS请求,并且它没有任何授权承载令牌,因此它以4xx http代码响应。
我应该避免OPTIONS
次请求吗?
private boolean isExcluded(ServletRequest request) {
return ((HttpServletRequest)request).getMethod().equalsIgnoreCase(HttpMethod.OPTIONS);
}
在doFilter
:
if (this.isExcluded(request))
chain.doFilter(request, response);
else
//...
这是对的吗?
答案 0 :(得分:2)
任何CORS处理都应在任何身份验证之前完成。实现它的正确方法是在任何auth过滤器之前有一个CORS过滤器。在CORS过滤器中,检查它是否是预检请求。如果是,则以200响应并设置CORS响应头。然后从过滤器返回,因此没有进一步处理。如果它不是预检请求,那么只需转到链中的下一个过滤器。
CORS过滤器仅在响应端实现,让请求像往常一样是不好的实现。例如,my post here是一个非常糟糕的例子。这就是为什么我链接到RESTEasy CorsFilter
作为应如何实施的示例。
有关CORS预检的更多信息,请参阅the MDN(如果您想了解它应该如何工作,必须阅读)。然后检查RESTEasy CorsFilter以了解它是如何正确实现的。虽然它使用JAX-RS过滤器,但您可以获得一些使其适用于servlet过滤器的想法。需要注意的是,JAX-RS过滤器分为两个过滤器(请求和响应),而servlet过滤器则用于过滤器,在此处进行预处理 - >处理请求 - >后期过程。 JAX-RS过滤器就像预处理和后处理一样。
另请注意,OPTIONS请求并不总是预检。您还应该检查Origin
标题。