跨域问题

什么是跨域请求问题?

这个问题的原由在于现代浏览器默认都会基于安全缘由而阻止跨域的ajax请求,这是现代浏览器中必备的功能,可是每每给开发带来不便。java

但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿们想出了许许多多的方法,例如,jsonP、代理文件等等。但这些作法增长了许多没必要要的维护成本,并且应用场景也有许多限制,例如jsonP并不是XHR,因此jsonP只能使用GET传递参数。web

在移动应用风生水起的现在,托HTML5的福,Mobile Web,甚至Hybird App也逐渐火起来,在本地文件系统的Web页面,也有须要获取外部数据的需求,而这些需求也必然是跨域的。同时,HTML5也来带了叫“Cross-Origin Resource Sharing”的新特性,来赋予开发者权力决定资源是否容许被跨域访问。ajax

如何解决?spring

CORS,CrossOrigin Resources Sharing,也即跨源资源共享,是 HTML5 的一项特性,它定义了一种浏览器和服务器交互的方式来肯定是否容许跨域请求。json

经过服务器增长一个特殊的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依旧会被阻拦,经过这种方式网站拥有者能够本身对此进行限制。服务器

固然,若是不想限制来源,能够经过app

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>
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息