美文网首页异常总结
OPTIONS 请求失败

OPTIONS 请求失败

作者: bighome | 来源:发表于2019-01-28 17:27 被阅读0次

这个异常也是比较特殊的,所以我觉得有必要贡献出来。

背景

首先,无论客户端或者服务端,都已经做好可跨域请求的相关代码准备。所以,并不是简单的配置问题。

请求头:

OPTIONS /layout/saveLayout HTTP/1.1
Host: baby.sankuai.com
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)  AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Access-Control-Request-Headers: x-requested-with
Accept: */*
Accept-Encoding: gzip
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: keep-alive

响应:

HTTP/1.1 403 Forbidden
Server: Tengine
Date: Thu, 27 Sep 2018 07:33:59 GMT
Content-Length: 20
Connection: keep-alive
Keep-Alive: timeout=5
Access-Control-Allow-Origin: http://localhost:8080
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type,x-requested-with,Authorization,access-token
Allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH

Invalid CORS request

可以看出,响应的 Access-Control-Allow-Origin、Access-Control-Allow-Methods,Access-Control-Allow-Headers,Allow 都包含了请求所需的内容,所以这个头配置这边妥妥的,没有问题。
(当然,如果这个也可以用来排查配置相关的问题。是否配置正确,把两个头拿出来看看就知道了,别整其它没用的。)

通过请求头可以看出,这是个options(预检)请求。在看响应头,返回状态码403,应该是预检失败了。

查看相应的服务器日志,找到如下报错信息:

java.lang.NoClassDefFoundError: javax/servlet/DispatcherType

一般的,这种异常信息,我第一反应就是jar包冲突。由于是javax/servlet下的,猜想和servlet-api有关。因为 servlet-api 在maven中配置的为 provided ,所以运行时使用的是 tomcat/lib 下的 servlet-api.jar。

经排查,发现3.0以下的jar包中是没有这个类的,只有3.0及以上才有。所以到tomcat的官网看了下版本信息对照表:


image.png

可以看到servlet 3.0 版本对应着 tomcat 7.0.x。
在本地使用tomcat 7 和 8 调式服务,没有发现问题。
登录跳板机查看现在机器tomcat版本,发现线上版本为 6.0.x版本。

于是又下载了 tomcat 6 的版本,重现了问题。经调试,发现是 Spring mvc 的 RequestMethodsRequestCondition (Spring mvc版本 4.3.7),使用了 DispatcherType ,而 tomcat 6 使用的 servlet 版本是 2.5,源码里并没有DispatcherType这个类。

解决

1.替换tomcat servlet版本
2.降级spring mvc版本
3.升级tomcat版本
替换与降级风险都不可控,故最后选择升级tomcat版本。

参考文献

tomcat官方版本对照

相关文章

  • OPTIONS 请求失败

    这个异常也是比较特殊的,所以我觉得有必要贡献出来。 背景 首先,无论客户端或者服务端,都已经做好可跨域请求的相关代...

  • ab压测基本命令

    ab [options] url options. -n 请求数量-c 并发数-H 请求头-p POS...

  • 说说对options 的理解

    什么是options请求,简单的说就是可以用 options 请求去嗅探某个请求在对应的服务器中都支持哪种请求方法...

  • CORS 比较详细的说明

    一个CORS请求的流程 发送一个预检请求都为Options请求,因为Options请求不会对服务器做出任何改动。且...

  • OPTIONS 请求方法

    OPTIONS请求方法的主要用途有两个: 1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。 2、用来...

  • options方式请求

    后台写错误了 第二次请求的请求头里如果有Content-Type:application/json就会请求两次

  • http options请求

    OPTIONS请求即预检请求,可用于检测服务器允许的http方法。当发起跨域请求时,由于安全原因,触发一定条件时浏...

  • options请求问题

    最近在项目中遇到一个问题,发送请求时,浏览中显示发送了两个请求,一个是OPTIONS,另一个是实际的请求。然而后台...

  • options预请求

    最近开发过程中,为了避免跨域,于是在服务端添加了Access-Control-Allow-Origin,前端出现一...

  • 关于options请求

    有时我们在浏览器中发现发送的ajax请求自动请求两次,第一次是options请求,第二次才是你自己发送的get或p...

网友评论

    本文标题:OPTIONS 请求失败

    本文链接:https://www.haomeiwen.com/subject/sjzajqtx.html