通俗说就是从baidu.com请求google.com,从一个域名发起请求访问另一个域名的api接口
解决方案:
1、 ajax中提供属性如: dataType : ‘jsonp‘ 没有测试过
2、如果用servlet实现的,在需要跨域请求的对应servlet配置如下信息:
1 <servlet-name>abc</servlet-name> 2 3 <servlet-class>xxx.xx.xx.xx.pressAgencyCtrl</servlet-class> 4 5 <init-param> 6 7 <description>跨域访问</description> 8 9 <param-name>accessControlAllowOrigin</param-name> 10 11 <param-value>*</param-value> 12 13 </init-param> 14 15 </servlet> 16 17 <servlet-mapping> 18 19 <servlet-name>abc</servlet-name> 20 21 <url-pattern>/kyqq</url-pattern> 22 23 </servlet-mapping>
3、如果使用了springmvc等框架,实现filter
1 public class kuayu implements Filter { 2 @Override 3 public void init(FilterConfig config) throws ServletException{} 4 5 @Override 6 public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain){ 8 HttpServletResponse httpResponse = (HttpServletResponse) response; 9 HttpResponse.setHeader("Access-Control-Allow-Origin","*"); 10 httpResponse.setHeader("Access-Control-Allow-Headers","Authentication"); 11 chain.doFilter(request,httpResponse); 12 } 13 14 @Override 15 public void destroy(){}16 }
web.xml配置
1 <filter> 2 3 <filter-name>kuayu</filter-name> 4 5 <filter-class>xxx.xx.kuayu</filter-class> 6 7 </filter> 8 9 <filter-mapping> 10 11 <filter-name>kuayu</filter-name> 12 13 <url-pattern>/*</url-pattern> 14 15 </filter-mapping>
第二种方法直接使用springmvc提供的注解在controller控制器中,在controller注解上添加@CrossOrigin注解
4、在Nginx中配置
nginx.conf:
http{
.........
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Method GET,POST,OPTIONS;
..........
}
Access-Control-Allow-Origin: 允许跨域访问的域,可以是一个域的列表,也可以是通配符"*"。这里要注意Origin规则只对域名有效,并不会对子目录有效。即http://foo.example/subdir/ 是无效的。但是不同子域名需要分开设置,这里的规则可以参照同源策略
Access-Control-Allow-Credentials: 是否允许请求带有验证信息,XMLHttpRequest请求的withCredentials标志设置为true时,认证通过,浏览器才将数据给脚本程序。
Access-Control-Expose-Headers: 允许脚本访问的返回头,请求成功后,脚本可以在XMLHttpRequest中访问这些头的信息
Access-Control-Max-Age: 缓存此次请求的秒数。在这个时间范围内,所有同类型的请求都将不再发送预检请求而是直接使用此次返回的头作为判断依据,非常有用,大幅优化请求次数
Access-Control-Allow-Methods: 允许使用的请求方法,以逗号隔开
Access-Control-Allow-Headers: 允许自定义的头部,以逗号隔开,大小写不敏感