SpringMvc+AngularJS通过CORS实现跨域方案
来源:互联网 发布:php空心菱形原理 编辑:程序博客网 时间:2024/04/30 11:07
什么是跨域请求问题?
这个问题的起因在于现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能,但是往往给开发带来不便。
但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿们想出了许许多多的方法,例如,jsonP、代理文件等等。但这些做法增加了许多不必要的维护成本,而且应用场景也有许多限制,例如jsonP并非XHR,所以jsonP只能使用GET传递参数。
在移动应用风生水起的如今,托HTML5的福,Mobile Web,甚至Hybird App也逐渐火起来,在本地文件系统的Web页面,也有需要获取外部数据的需求,而这些需求也必然是跨域的。同时,HTML5也来带了叫“Cross-Origin Resource Sharing”的新特性,来赋予开发者权力决定资源是否允许被跨域访问。
如何解决?
CORS,CrossOrigin Resources Sharing,也即跨源资源共享,是 HTML5 的一项特性,它定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。
通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告知客户端跨域的限制,如果浏览器支持CORS的话,如果判断Origin通过的话,就会允许XHR进行请求,而不需要再使用jsonP或者代理文件。
使用这个Header返回被允许请求跨域请求的来源域,例如网站duelist.cn设置了下面的Header
Access-Control-Allow-Origin: http://smdcn.net
这样设置之后,通过http://smdcn.net下的页面对于duelist.cn进行ajax请求就会被允许,而其他网站对duelist.cn依旧会被阻拦,通过这种方式网站拥有者可以自己对此进行限制。
当然,如果不想限制来源,可以通过
Access-Control-Allow-Origin: *
来允许任何站点对该资源进行跨域请求
在SpringMVC下的解决方案:
定义SimpleCORSFilter
import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;@Componentpublic class SimpleCORSFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "x-requested-with");chain.doFilter(req, res);}public void init(FilterConfig filterConfig) {}public void destroy() {}}
web.xml:
<filter> <filter-name>cors</filter-name> <filter-class>com.app.filter.SimpleCORSFilter</filter-class></filter><filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
angularjs端代码:
$http({method: "post",url: "http://localhost:8080/eifs/usr/login.json",data: {para1:"para1",para2:"para2"},headers: { 'Content-Type': 'application/x-www-form-urlencoded'} }).success(function (data) { }).error(function (data) { });$http.get('http://localhost:8080/eifs/usr/login.json', {params:{para1:"para1",para2:"para2"},timeout: 10000}) .success(function (data, status, headers, config) { }).error(function (data, status, headers, config) { });
参考:
spring guide:https://spring.io/guides/gs/rest-service-cors/
- SpringMvc+AngularJS通过CORS实现跨域方案
- SpringMvc+AngularJS通过CORS实现跨域方案
- Angular通过CORS实现跨域方案
- 通过CORS实现跨域方案
- SpringMvc通过CORS实现跨域
- SpringMvc互联AngularJS通过代码拦截实现跨域方案
- nginx通过CORS实现跨域
- Rails 4 + angularjs CORS - 跨域实现的办法
- 基于springMVC与angularJS的跨域问题解决方案
- WebApi 跨域问题解决方案:CORS
- WebApi 跨域问题解决方案:CORS
- Springmvc 支持 cors跨域请求
- angularJS通过jsonp实现跨域访问
- JavaScript CORS实现跨域
- CORS实现跨域请求
- cors实现跨域请求
- Tomcat通过CORS解决跨域问题
- Tomcat通过CORS解决跨域问题
- 常用的正则表达式(合集)
- java-InputStreamReader 和 OutputStreamWriter类用法简介,及演示。
- 如何生成随机数(上)
- tcpdump非常实用的抓包实例
- Hibernate4 session中的createCriteria方法
- SpringMvc+AngularJS通过CORS实现跨域方案
- MySQL学习笔记_3_MySQL创建数据表(中)
- OpenCV GPU模块+NPP
- onNewIntent用法
- 黑马程序员——Java基础——多线程(三)
- 用JavaScript隐藏控件的方法
- 黑马程序员——Java高新技术——JDK4.5版本新特性枚举、高级for循环、静态导入、可变参数、基本数据类型的自动装箱与拆箱
- 粗学聚类(1)
- 如何辨别密码安全糟糕的网站