gpt4 book ai didi

jetty - 如何配置嵌入式 Jetty 以处理 OPTIONS 预检请求?

转载 作者:行者123 更新时间:2023-12-03 20:38:18 25 4
gpt4 key购买 nike

我正在开发一个使用嵌入式 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 的文档,以及在调用 setInitParameter 时将哪些 CrossOriginFilter 常量用作属性键(此外,由于该方法调用的第二个参数是一个字符串,我真的不知道如何格式化值)。

我应该在 CrossOriginFilter 上设置哪些参数来处理 OPTIONS 请求?如果我在上面说了什么错误或做出了任何错误的假设,请纠正我!我对此的经验非常有限。

最佳答案

CrossOriginFilter 的文档:

http://www.eclipse.org/jetty/documentation/current/cross-origin-filter.html

CrossOriginFilter 的 Javadoc:

http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/servlets/CrossOriginFilter.html

实际源代码:(有时这也有助于人们理解):

https://github.com/eclipse/jetty.project/blob/jetty-9.2.3.v20140905/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/CrossOriginFilter.java

简而言之,您可能希望将 OPTIONS 添加到允许的方法中。

(就像javadoc说的那样)

FilterHolder holder = new FilterHolder(new CrossOriginFilter());
holder.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD,OPTIONS");
appHandler.addFilter(holder, "/*", EnumSet.of(DispatcherType.REQUEST));

现在,要解决您遇到的另一个错误...

这没有任何作用...
holder.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_CREDENTIALS_HEADER,
"true");

那不是初始化参数键。 (实际上,这是 Access-Control-Allow-Credentials 的 header 名称常量)如果您想允许凭据,请按照 javadoc 的说明进行操作。
holder.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM, "true");

关于jetty - 如何配置嵌入式 Jetty 以处理 OPTIONS 预检请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com