首页 > V2EX > V2EX-CORS 和 JQUERY POST 打架了怎么办?求个解决之道
2022
06-23

V2EX-CORS 和 JQUERY POST 打架了怎么办?求个解决之道

cpstar:

昨天折腾发现了一个问题,脑袋一热,没找到根源就发了帖子 https://www.v2ex.com/t/861503 ,最后发现是 CORS 的问题。但是新的问题又来了。

使用的是 Tomcat 8.5 ,用了官方的 CORS 。其中有一段代码是这样的

} else if ("POST".equals(method)) {
    String mediaType = getMediaType(request.getContentType());
    if (mediaType != null) {
        if (SIMPLE_HTTP_REQUEST_CONTENT_TYPE_VALUES.contains(mediaType)) {
            requestType = CORSRequestType.SIMPLE;
        } else {
            requestType = CORSRequestType.ACTUAL;
        }
    }
} else {

其中 SIMPLE_HTTP_REQUEST_CONTENT_TYPE_VALUES 是 application/x-www-form-urlencoded, multipart/form-data, text/plain 其中之一; CORSRequestType 默认是 INVALID_CORS ,也就是返回 403 的情况。

所以结论就是如果 POST 方法,Header 没有 Content-Type ,mediaType==null ,则走向了 403 ,解释了原帖的疑惑。可是问题根源在哪里呢?

系统使用了比较古老的 JQuery 1.12 ,其中的片段是这样的:

// Set the correct header, if data is being sent
if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
jqXHR.setRequestHeader( "Content-Type", s.contentType );
}

这就是如果 data==””,那就不设置 Content-Type 。另外,POST 通过 querystring 提供了一些数据,所以 s.hasContent==true 。

一个驴唇,一个马嘴,还真对上了?。一个是 POST 不见 Content-Type 就觉得不安全,一个是没有实际 data 就不搞 Content-Type 。而实际上 POST 是可以没有内容以及没有 Content-Type 的吧。

那么怎么解决呢??

  • 修改 CORSFilter ?我认为这可能是一个 BUG ,因为这个 mediaType 的 if 没有 else ,或者原本的计划就是不能缺失 Content-Type ,缺失则是 403 。如果这里有问题,那就直接加上 else requestType = CORSRequestType.ACTUAL 重新编译然后注入到 Tomcat 里。
  • 修改 JQuery ?不知道新版 JQuery 如何认知这件事情的。可以搞一个拦截,比如 jquery 代码片段那里的 s.data 改成(true||s.data)。

CORS 和 JQUERY 两方的原则是啥?改谁?

from V2EX-最新主题 https://ift.tt/P4DfjGd
V2EX-CORS 和 JQUERY POST 打架了怎么办?求个解决之道 - 第1张  | 牛叻网(NiuL.Net)

最后编辑:
作者:分享菌
这个作者貌似有点懒,什么都没有留下。

留下一个回复