我正在开发一个使用嵌入式 Jetty 的项目(不幸的是,我只是“继承”了项目的服务器端,并且对 Jetty 的使用及其配置不是很熟悉)。
突然出现了一个奇怪的案例-我会尽力描述:
基于 Web 的 UI(使用 AngularJS,来自不同的域,因此使用了 CORS)发送 POST 请求以更改服务器上某些内容的状态。这在过去的某个时候有效(它最后一次使用可能是在一个月左右之前)。
昨天这停止了工作。检查 REST 调用,我看到首先发出了一个 OPTIONS 请求。POST 的内容类型是 application/json,所以根据我的阅读,这是正确的。我不确定为什么之前没有发送它 - 公司最近更新了 Chrome 版本,而旧版本没有发送预检请求,但这只是猜测。无论如何,我认为这是我的应用程序中用于为 CORS 配置 Jetty 的相关代码:
FilterHolder holder = new FilterHolder(new CrossOriginFilter());
holder.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER, "true");
appHandler.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));
POST 请求一切正常。我可以通过使用 --disable-web-security 标志启动 Chrome 来验证这一点。没有发送任何 OPTIONS 请求,并且 POST 正常工作。
我的想法是,因为它适用于 POST,所以它不是授权或安全问题 - 只是 Jetty 没有正确配置来处理预检请求(它只返回 401)。
我找不到太多关于嵌入式 Jetty 的文档,以及哪些 CrossOriginFilter 常量在调用 setInitParameter 时用作属性键(此外,由于该方法调用的第二个参数是一个字符串,我真的不知道如何格式化值)。
我应该在 CrossOriginFilter 上设置哪些参数来处理 OPTIONS 请求?如果我在上面说了什么错误或做出了任何错误的假设,请纠正我!我在这方面的经验非常有限。