Spring 支持 CORS 请求踩的坑

我来就讲讲思路

上一篇从零开始学 Java - Spring MVC 实现跨域资源 CORS 请求 中使用简单的配置后即可实现跨域请求,但是,我在走向配置成功的路上由于我瞎,掉进了一个大坑,因为是 Spring MVC 版本 4.2 及以上才支持 CORS 配置,所以,我下载了 4.2.5 配置后一直报错,接着我下载了 4.2.6 版本依然报这样的错误

corsError.PNG

报错信息具体代码如下:

 
  1. 严重: StandardWrapper.Throwable
  2. org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Cannot locate BeanDefinitionParser for element [cors]
  3. Offending resource: ServletContext resource [/WEB-INF/springMVC-servlet.xml]
  4. at org.springframework.beans.factory.parsing.FailFastProblemReporter.fatal(FailFastProblemReporter.java:60)
  5. at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:68)
  6. at org.springframework.beans.factory.parsing.ReaderContext.fatal(ReaderContext.java:55)
  7. at org.springframework.beans.factory.xml.NamespaceHandlerSupport.findParserForElement(NamespaceHandlerSupport.java:85)
  8. at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
  9. at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1424)
  10. at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1414)
  11. at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:189)
  12. at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:143)
  13. at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:110)
  14. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
  15. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
  16. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:335)
  17. at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303)
  18. at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
  19. at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216)
  20. at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187)
  21. at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
  22. at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
  23. at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
  24. at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
  25. at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:452)
  26. at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
  27. at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
  28. at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
  29. at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
  30. at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
  31. at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
  32. at javax.servlet.GenericServlet.init(GenericServlet.java:158)
  33. at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1282)
  34. at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1195)
  35. at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1085)
  36. at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5349)
  37. at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5641)
  38. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147)
  39. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
  40. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
  41. at java.util.concurrent.FutureTask.run(Unknown Source)
  42. at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  44. at java.lang.Thread.run(Unknown Source)

我搞了整整一个上午,任何方法都尝试了,已经快要崩溃了,依然没解决掉。

首先,我用谷歌搜出来的信息没有一个是可以的,接着,我去查看官方文档、看源码,他们也是丝毫没有提到这个问题,我也开始怀疑人生了,你懂这种感觉的。
整个项目组的人试着各种办法解决,依然没有任何作用,最后大家说:要不我们还是换回老版本吧,用最原始的方式跨域?我说,你们让我再试试吧... 这个期间,找来公司的技术大牛也来帮我解决这个问题,浪费了他老半天时间依然找不到原因,感谢他浪费时间陪我折腾。

我又加了几个技术群,在每个群里发这个错误,求解决。这期间除了几个招聘的 HR 勾引我,还是有几个群友出来帮我找问题的,最后我看到他们都是在用「百度一下」的时候,我也就放弃了,因为结果可想而知的。但是,我依然很感谢他们的热情。

再接着,我去了一个技术社区发问题、提问了。我得到的结果和大家百度出来的一样一样的。
coreQA.PNG

问题解决了

下班回到家,饭都吃不了了。第二天,到公司后,一同事告诉我:昨天晚上我回家新建了一个项目,配置后就可以成功的。我快要泪奔了,我说:昨天我们又复制一个项目去去掉所有的配置也不行的啊?然后,我俩当场又新建了一个项目,竟然启动成功了!!!

接着,安装刚刚的配置修改项目,依然不成功。我特么真是日了狗了...我就去了厕所。

从厕所回来,我突然的发现,由于我们 Spring 版本升级到了4.2.6,Build Path里的 jar 包都是导入的 4.2.6 版本的,但是但是,我没把 4.1 的版本的删除掉删除掉删除掉!!!

我到现在依然想不通的是:我们项目中导的 jar 包是 4.2.6 版本的,只是老版本的 jar 包没从 WEB-INF\lib 下删除,它为啥依然回去加载老版本 jar 包?

最后总结一下

这次踩的坑主要原因在于我,因为我没及时删除WEB-INF\lib下老版本 jar 包,因为我们当时是知道这目录下是有老版本jar包的,大家都认为没有影响,因为并没有加载它。这可能是大家的一个普遍的误区吧!

现在大家再搜索Configuration problem: Cannot locate BeanDefinitionParser for element [cors]这个错误信息后,会找到我的提问和这篇文章,免得大家再次走进误区,浪费时间,那这篇文章的目的就达到了。谢谢你,看我唠叨到最后。

 

http://blog.mayongfa.cn/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值