什么是跨域请求问题?java
这个问题的原由在于现代浏览器默认都会基于安全缘由而阻止跨域的ajax请求,这是现代浏览器中必备的功能,可是每每给开发带来不便。angularjs
但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿们想出了许许多多的方法,例如,jsonP、代理文件等等。但这些作法增长了许多没必要要的维护成本,并且应用场景也有许多限制,例如jsonP并不是XHR,因此jsonP只能使用GET传递参数。web
在移动应用风生水起的现在,托HTML5的福,Mobile Web,甚至Hybird App也逐渐火起来,在本地文件系统的Web页面,也有须要获取外部数据的需求,而这些需求也必然是跨域的。同时,HTML5也来带了叫“Cross-Origin Resource Sharing”的新特性,来赋予开发者权力决定资源是否容许被跨域访问。ajax
如何解决?
CORS,CrossOrigin Resources Sharing,也即跨源资源共享,是 HTML5 的一项特性,它定义了一种浏览器和服务器交互的方式来肯定是否容许跨域请求。spring
经过服务器增长一个特殊的Header[Access-Control-Allow-Origin]来告知客户端跨域的限制,若是浏览器支持CORS的话,若是判断Origin经过的话,就会容许XHR进行请求,而不须要再使用jsonP或者代理文件。json
使用这个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; @Component public 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/