Spring Security OAuth2:CORS预检频道没有成功

时间:2015-08-28 05:58:44

标签: oauth spring-boot cors jhipster spring-security-oauth2

当我在我自己的系统上运行的服务器实例进行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).

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

我可以做些什么来摆脱这个。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您的过滤器不需要使用 <td>First:</td> <td><input type="text" class="calc" value=""></td> </tr> <tr> <td>Second:</td> <td><input type="text" class="calc" value=""></td> </tr> <tr> <td>Result:</td> <td><input type="text" id=""></td> 进行注释,并且应该在@Component类中使用足够的url模式映射,就像JHipster中使用的其他过滤器一样。

此外,您的过滤器不应像OPTIONS那样破坏过滤器链。在标题中允许OPTIONS方法然后在处理OPTIONS请求时不返回标题是不一致的。

答案 1 :(得分:0)

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