JFinal、Springboot等跨域缺陷解决一例

原创
2022/07/29 13:30
阅读数 801

在前后分离项目中,尤其是非VUE等前后分离类项目,有个隐藏的很深的跨域类问题经常骚扰码农们,通常出现在上传文件时:
”我明明都已经设置了允许跨域,可是为什么还是会提示跨域问题?“

报错经常为:
has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.

其实问题的关键在于:
It does not have HTTP ok status.

这个提示,其实已经告诉了原因,就是请求没有收到有效的回应。

很多人可能就懵逼了,我明明是发送了回应的嘛!

这个懵逼的原因,就是对于HTTP请求掌握的不够深,以为HTTP请求就是POST 和 GET。

其实真实原因是,浏览器在正式上传前,会发送一个OPTIONS请求!

而后端如果代码逻辑上存在某种缺陷,比如对于非预期请求未进行处理引发异常进而抛出500,或者其他造成无响应的情况,那么就会导致OPTIONS请求无结果;

也或者是没有使用全局处理,对于OPTIONS请求没有响应跨域指示,造成虽然有响应但是没有告诉它如何对待跨域;

如何解决该问题呢?

如果是JFinal框架,则在有全局拦截器发送允许跨域前提下,对OPTIONS请求进行处理,例如:

if(getRequest().getMethod().toUpperCase().equals("OPTIONS")){
            renderNull();
            return;
}

使用renderNull,来避免引发未定义视图的异常,当然,每个人代码都不一样,可能还有其他因为未处理OPTIONS造成的异常。

SpringBoot同理。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部