配置CORS解决跨域调用—反思思考问题的方式
2017-06-25 11:40
337 查看
导读:最近都在用一套完整的Java EE的体系做系统,之前都是用spring框架,现在弄这个Java EE,觉得新鲜又刺激。但,由于之前没有过多的研究和使用,在应用的过程中,也出现了不少的问题。累积了好几个,现在开始一一进行总结分享。这篇博客,主要是分享CORS解决跨域调用的过程
最开始是把代码生成,然后自动构建发布,让局域网类的同组小伙伴调用测试,也用postMan进行检测,没有发现问题(走到这一步,也是一路坑)。后来在进行Angular服务调用的时候,失败。具体错误信息如下:
但是,查了一下代码,发现这里面所用到的response是HttpServletResponse类型,而现在工程里面自动生成的代码,虽然也是返回一个Reponse,但这个Response和HttpServletResponse完全是两回事。要使用这种方法解决,得引入HttpServletReponse依赖,然后在每个方法里面增添response参数,还得修改原有的controller返回方式,也就意味着,原有系统的前端调用也需要重新改写。PS:
真有一种费了死劲拆东墙补西墙的感觉。
结论:不作为首选方案
2,想到了JSONP,但JSONP的访问方式受到了GET限制,不符合当前项目的需求。结论:不采用
3,CORS
最开始是在spring官网上找到了跨域的解决方案(团队要求首先从官网查资料),然后大概看了看,是自己写了个cors的filter,其实也就是配置了响应标头,基本代码如下:
web.xml文件配置
这个方案,测试通过。然后,其实还是有点麻烦(原谅我已经懒到了一种不可理喻的地步),也根据大哥的引导,说spring官网能提供这么一个解决方案,java EE也可能提供一个解决方案。然后,我就去官网看了看,果然,有解决方案。具体如下:
Enabling CORS for ADF Business Component REST Services
简单、粗暴!
最后解决了,但还出了个小毛病,报了405 (Method Not Allowed) ,我就回头去看我的程序,发现理论上没问题,就再看了看具体的错误信息:
终于,本宝宝发现了POST,然后很确定提供服务的访问方式是GET,问题就这么解决了。所以,再一次提醒我自己,认真看错误信息!
我之前的常有习惯:遇到问题,先看看官网,不行的话,就百度和谷歌一下,然后再不行,我就问问项目组的伙伴。这种方式,本身没有什么大问题。但是,今天学习到了大哥的一种思维方式:spring官网提供了一个解决方案,由此推导Java EE官网也可能提供一个官方解决方案。就这种由此及彼的推导方式,联系思维,在之前,我还是比较弱的。今后,要好好实践运用!
一、问题的出现
由于我们在项目中使用了一个很牛掰的插件Jeddict,然后除了逻辑性的代码,其他基本的代码(从dao到前端Angular)都是插件生成的,所以,我们要做的,就是连通前端Angular和后端自动生成的Restful接口。PS:对于Jeddict的问题,后续博客中再进行说明。最开始是把代码生成,然后自动构建发布,让局域网类的同组小伙伴调用测试,也用postMan进行检测,没有发现问题(走到这一步,也是一路坑)。后来在进行Angular服务调用的时候,失败。具体错误信息如下:
二、解决过程
1,首先是之前遇到过跨域问题的小伙伴,提出了一个方案,说只要在后端返回数据的时候,设置一下header就可以解决。具体代码如下://解决跨域问题 response.setHeader("Access-Control-Allow-Origin", "*");
但是,查了一下代码,发现这里面所用到的response是HttpServletResponse类型,而现在工程里面自动生成的代码,虽然也是返回一个Reponse,但这个Response和HttpServletResponse完全是两回事。要使用这种方法解决,得引入HttpServletReponse依赖,然后在每个方法里面增添response参数,还得修改原有的controller返回方式,也就意味着,原有系统的前端调用也需要重新改写。PS:
真有一种费了死劲拆东墙补西墙的感觉。
结论:不作为首选方案
2,想到了JSONP,但JSONP的访问方式受到了GET限制,不符合当前项目的需求。结论:不采用
3,CORS
最开始是在spring官网上找到了跨域的解决方案(团队要求首先从官网查资料),然后大概看了看,是自己写了个cors的filter,其实也就是配置了响应标头,基本代码如下:
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse)response; res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); res.setHeader("Access-Control-Max-Age", "3600"); res.setHeader("Access-Control-Allow-Headers", "x-requested-with"); chain.doFilter(request, response); }
web.xml文件配置
<!-- cors解决跨域访问问题 --> <filter> <filter-name>cors</filter-name> <filter-class>com.ustcinfo.kanms.support.SimpleCORSFilter</filter-class> </filter> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这个方案,测试通过。然后,其实还是有点麻烦(原谅我已经懒到了一种不可理喻的地步),也根据大哥的引导,说spring官网能提供这么一个解决方案,java EE也可能提供一个解决方案。然后,我就去官网看了看,果然,有解决方案。具体如下:
Enabling CORS for ADF Business Component REST Services
简单、粗暴!
最后解决了,但还出了个小毛病,报了405 (Method Not Allowed) ,我就回头去看我的程序,发现理论上没问题,就再看了看具体的错误信息:
终于,本宝宝发现了POST,然后很确定提供服务的访问方式是GET,问题就这么解决了。所以,再一次提醒我自己,认真看错误信息!
三、个人总结
哎,发现一个可以让自己有所提升的点,是什么呢?分析一下:我之前的常有习惯:遇到问题,先看看官网,不行的话,就百度和谷歌一下,然后再不行,我就问问项目组的伙伴。这种方式,本身没有什么大问题。但是,今天学习到了大哥的一种思维方式:spring官网提供了一个解决方案,由此推导Java EE官网也可能提供一个官方解决方案。就这种由此及彼的推导方式,联系思维,在之前,我还是比较弱的。今后,要好好实践运用!
相关文章推荐
- 配置CORS解决跨域调用—反思思考问题的方式
- 解决 Silverlight 调用 WCF 服务 跨域访问 和 Silverlight 引用服务后配置文件不加载的问题
- 配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题
- Java服务端Cors跨域资源共享配置,解决与Spring Security冲突引起的问题
- 解决 Silverlight 调用 WCF 服务 跨域访问 和 Silverlight 引用服务后配置文件不加载的问题
- Java服务端Cors跨域资源共享配置,解决与Spring Security冲突引起的问题
- Vue.js2 + Laravel5 采用 CORS 方式解决 AJAX 跨域的问题
- 网站调用其他域名的静态文件导致的跨域问题、CORS错误解决方法
- Spring @Async配置4. 基于@Async无返回值调用 使用的方式非常简单,一个标注即可解决所有的问题: 1 @Async //标注使用 2 public void asyncMe
- 解决 Silverlight 调用 WCF 服务 跨域访问 和 Silverlight 引用服务后配置文件不加载的问题
- java服务端解决js跨域的问题 CORS(跨域资源共享) 的配置
- 利用nginx解决js跨域调用问题
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
- 【强烈推荐】如何解决JQuery类Post方式的跨域问题 - 空山雪林通用模块设计工作室 - ITeye技术网站
- 解决问题前的思考,欧拉计划27题的反思,3次优化和求解
- .Net MVC4 被坑心得(十)解决jquery调用webapi时跨域问题
- 【转】hibernate annotation方式配置实体关联关系,解决关联外键数据不存在时抛出异常的问题
- cas ajax登录方式跨域时session丢失问题解决
- (转)jquery跨域调用webService,以及解决跨域情况下只能返回XMl格式数据的问题
- 某项目要调用现有的100多个DLL 三 先解决为一个类型做一个跨域的问题