应该是承载令牌过滤器避免OPTIONS请求吗?

时间:2017-08-29 14:22:31

标签: java-ee oauth-2.0 jax-rs

我使用过滤器来检查授权承载令牌是否有效。尽管如此,我还是认为用户代理(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
    //...

这是对的吗?

1 个答案:

答案 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标题。