春季安全OAuth2: CORS预飞行通道不成功



当我对自己系统上运行的服务器实例进行HTTP调用时,我在调用'/oauth/token'时收到此错误。我通过创建一个这样的过滤器来修复这个问题:

@Component
public class SimpleCORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    HttpServletRequest httpServletRequest = (HttpServletRequest) req;
    if (httpServletRequest.getMethod() != "OPTIONS") {
      chain.doFilter(req, res);
    } else {
        // In case of HTTP OPTIONS method, just return the response
    }
}

我已经添加了它作为一个过滤器在WebConfigurer:

private void initCORSFilter(ServletContext servletContext, EnumSet<DispatcherType> disps) {
    log.debug("Registering CORS Filter");
    FilterRegistration.Dynamic corsFilter = servletContext.addFilter("corsFilter", new SimpleCORSFilter());
    Map<String, String> parameters = new HashMap<>();
    corsFilter.setInitParameters(parameters);
    corsFilter.addMappingForUrlPatterns(disps, true, "/*");
    corsFilter.setAsyncSupported(true);
}

我在FireFox中得到这个错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://182.176.221.94:9091/ams/oauth/token. (Reason: CORS preflight channel did not succeed).

简而言之,我确保飞行前选项呼叫总是得到响应继续前进。这在我自己的系统上工作,但是现在服务器实例部署在Linux服务器上,我再次遇到这个问题。我只在调用'oauth/token'时得到这个,其他所有调用都工作正常。

我该怎么做才能摆脱这个呢?任何帮助吗?

您的过滤器不需要用@Component注释,它应该像JHipster中使用的其他过滤器一样在WebConfigurer类中映射适当的url模式。

同样,你的过滤器不应该像OPTIONS那样破坏过滤器链。如果你正在处理一个OPTIONS请求,在header中允许OPTIONS方法,然后不返回header是不一致的。

问题是我正在使用!=比较if (httpServletRequest.getMethod() != "OPTIONS"。我把它改为if (!httpServletRequest.getMethod().equalsIgnoreCase("OPTIONS")),它工作了。这可能与我在运行代码库时在本地机器上进行测试,但从中创建了一个WAR文件并将其部署在服务器上而无法工作有关。我不确定到底是什么原因,但这解决了这个问题。

最新更新