看了挺多文章,貌似都不是我的答案。
第三方平台访问项目接口,项目用tomcat8发布到云服务器上,用postman本地测试云服务器没有问题
开始,以为是跨域问题,尝试加@CrossOrigin注解,然而问题依旧。
看了挺多文章,貌似都不是我的答案。
第三方平台访问项目接口,项目用tomcat8发布到云服务器上,用postman本地测试云服务器没有问题
开始,以为是跨域问题,尝试加@CrossOrigin注解,然而问题依旧。
此问题已解决,问题的解决主要还是重现了此错误,并debug到问题所在。在本地运行时没有问题的,没有往代码错误这个事情上去想,另外查看日志也因为错误的行数导致错误真正的错误行数。
废话真多,哈哈,自己以后要注意。
为了重现这个错误,首先跟第三方要了请求代码的文件,去掉所有拦截器的注解,在本地运行了一次,重现了问题并解决。那么为什么本地运行没有问题,到服务器就有问题了呢?那是因为用HttpServletRequest请求的getParameterMap方法在跨域(本地运行时没有跨域的)访问的时候,通过源码可知会对HashMap多了一个锁定的属性,这是tomcat以及很多工具为了遵守游览器的同源策略,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
那么知道了问题所在,解决起来就很简单了。
根据网上文章找到以下解决方式。
第一种跨域注解@CrossOrigin或者写拦截器。具体本文就不介绍了,因为没有解决我的问题。
第二种重写getParameterMap方法,这个也感觉本来如果重写了,等于放弃了同源策略,是不是很容易受到攻击,所以没有尝试。
第三种反射到锁定属性,并改值,接触锁定。也没尝试
第四种在获取getParameterMap方法的结果后,不要直接去put(我就是为了好看,有个地方put了)或者非要put,自己定义一个map接收getParameterMap方法的值,作下转换,自然put的锁定就不存在了。
以上就是我遇到问题后整体解决方案。(过程更复杂一点,为自己的无知感到愧疚)