在服务器端开启跨域的原理,一般都是通过在HTTP Headers
中的响应头的Access-Control-Allow-Origin
指定放行的域,来完成的。
Access-Control-Allow-Origin
响应头指定了该响应的资源是否被允许与给定的域(origin)共享。
跨域出错,一般在浏览中会有:
'http://xxxxx' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
要开启全局跨域也有很多的方式,如下:
可以在添加filter
指定共享的域
filter类
import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CrossOriginFilter implements Filter { private FilterConfig config = null; @Override public void init(FilterConfig config) throws ServletException { this.config = config; } @Override public void destroy() { this.config = null; } /** * @comment 跨域的设置 */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse httpResponse = (HttpServletResponse) response; // 表明它允许"http://xxx"发起跨域请求 httpResponse.setHeader("Access-Control-Allow-Origin", config.getInitParameter("AccessControlAllowOrigin")); // 表明在xxx秒内,不需要再发送预检验请求,可以缓存该结果 httpResponse.setHeader("Access-Control-Allow-Methods", config.getInitParameter("AccessControlAllowMethods")); // 表明它允许xxx的外域请求 httpResponse.setHeader("Access-Control-Max-Age", config.getInitParameter("AccessControlMaxAge")); // 表明它允许跨域请求包含xxx头 httpResponse.setHeader("Access-Control-Allow-Headers", config.getInitParameter("AccessControlAllowHeaders")); chain.doFilter(request, response); } }
web.xml的配置中
<!-- CORS过滤器--> <filter> <filter-name>CrossOrigin</filter-name> <filter-class>cn.mashirodever.blog.filter.CrossOriginFilter</filter-class> <init-param> <param-name>AccessControlAllowOrigin</param-name> <param-value>*</param-value> </init-param> <init-param> <param-name>AccessControlAllowMethods</param-name> <param-value>HEAD,POST,GET,DELETE,PUT</param-value> </init-param> <init-param> <param-name>AccessControlMaxAge</param-name> <param-value>3628800</param-value> </init-param> <init-param> <param-name>AccessControlAllowHeaders</param-name> <param-value>x-requested-with</param-value> </init-param> </filter> <filter-mapping> <filter-name>CrossOrigin</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这种方法在spring项目中支持性会比filter好些,有时用filter不行的可尝试切换到这种。有一次就是filter中配置了允许的请求方法,但是只有get能跨域,post请求就一直报cors错误。换到这种就好了