前阵子帮客户做了一个系统,系统有对接客户第三方OA系统,调用OA提供的接口发起待办、待阅、启动流程等。在调用OA接口时,不定时会出现403的错误。重启我们系统就可以正常请求,然后不定时会出现403错误。
因为在网上找了关于403错误的资料,发现很少有关于403错误的资料,所以以下是对记录本次403错误出现的原因及解决的思路。
当出现403错误时,想到的是请求被OA服务端、或者web容器拒绝。(因为系统在测试环境没有出现403的问题,测试和生产环境都是windows环境。环境也是我搭建的,环境都一样。)但是经过分析,我们系统重启之后又可以正常请求,且请求量不大,排除请求过多被拒绝访问及OA服务器的问题。
接着分析,可能是nginx的请求分发导致的,因为无法操作OA生产环境。只能在我们系统中将接口地址改成指定IP。不经过nginx分发。重启服务器,在生产环境测试了几天,又出现了403错误。排除nginx请求分发导致
再次出现问题后,就开始查看日志了,查看了OA生产服务器的tomcat的日志,出现403错误时,tomcat日志没有记录从我们系统发过去的请求。根据日志推断,出现403时,请求没有到OA服务器。请求为什么没有到OA服务器,是否是我们代码问题。但是测试环境又正常,排除代码问题。
后来想到同事有用过抓包软件进行抓包,所以我想我是不是也可以进行抓包进行分析。
我这里下载的抓包工具是Wireshark。
将Wireshark安装好后,看网上的使用教程,开启抓包,然后浏览器随便访问一个地址测试正常抓包。立马在本地发起了一个请求,根据抓包的信息是可以正常发起请求的。接着在生产环境使用抓包工具进行抓包,发起请求但是返回403,查看抓包的信息发现请求的地址不是OA服务器地址,变成了其他地址。然后重启服务器,发送请求,再次查看抓包的信息请求的地址正常,是OA服务器地址。到此找到大致的出现403的原因。
但是为什请求地址会变成其他地址。将地址在整个项目中进行检索,发现该地址在我们系统一个配置文件中存在,是一个代理地址,接着找到了使用了该地址的java类。查看了该类中的所有代码。发现代码中竟然设置了全局代理地址。
到此,找到了出现403的具体原因。
因为系统中有个定时任务,任务中调用了该方法。而该方法中又设置的是全局代理。所以任务执行后,启用了代理,之后所有的请求都会请求道该代理地址。才会导致调用OA接口出现403问题。
而我之前分析说代码没有问题,现在有事因为代码问题引起的。这里主要是因为,系统是又两个项目组进行开发的,根据两个大的方向分成两个项目,在进行代码合并的。不知道项目中还设置了代理地址。为什么测试环境没问题呢,因为测试环境没有启动定时任务
所以说在项目中要多沟通,也要多理解别人写的代码。
在解决该问题的时候,中间遇到的问题也挺多的,也经历的很久。这里只是将解决思路记录下来,中间遇到的一些问题没有记录。