跨域详解 been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

跨域问题的原因:浏览器出于安全考虑,限制访问本站点以为的资源。

比如你有一个 网站 127.0.0.1:8080/ , 并且上面挂了一个页面 ,那么在这个页面中 ,你只访问 本站点的 资源不会受到限制,但是你如果访问其他站点,比如  127.0.0.1:8081 的资源就会受到限制。

备注:暂且把  协议,域名,端口都一样的叫做同一个站点。

但是  带有 src 属性的标签可以没有这个 限制,比如 img ,script  等等。

在说说历史,以前的程序前后端不分离, 页面 和 请求接口,在同一个 域名同一个端口下面。 所有 浏览器认为来源这个 站点的页面 ,请求的是同一个站点的 接口,那么久会允许。

比如 127.0.0.1:8080/index.html  ,请求 127.0.0.1:8080/a/b/c/userLit 接口,这样是可以的

在说说现在,前后点分离,页面 和接口一般不是一个程序,这样就不允许,就会抛出这个异常。

比如前端页面放在  127.0.0.1:8081/index.html  ,后端接口  127.0.0.1:8080/a/b/c/userLit  ,这时候端口变了( 前面说了 ,协议,域名作者Ip ,端口 要一样才算一个站点  ),

解决办法:

1  比较老的  比较通用,也比较麻烦的 jsonp

原理 利用  <script src="这里面的地址可以跨域,并且返回的 js 代码会被 立即执行"  ></script>

这样 只要定义一个回调方法f( data ){ 处理数据 },然后  src 对应的接口需要 返回  f( data ); 这样的  格式,这样 在 这个数据返回以后就执行了 发f方法,并且带过来数据。

jquery 之类的 框架 有多这个  封装,随时随地动态的生产 <script> 标签 ,然后取得数据。

2 后端允许跨域

  这个就要看具体怎么部署的了。

  1 比如  静态页面在有个静态资源服务 nginx ,那么 就要在 nginx 上设置允许跨域,后端程序 在响应 Header中也带上允许跨域的 参数( 理论上如果是纯接口 应该不需要 )。

  2 如果 静态资源在 nginx中 ,并且前端 没有直接访问 后端 接口,而是 nginx 代理 了后端接口,前端总是请求的  ngxin ,因为 这样就是同一个域名了不会跨域。重点是前端不会直接请求后端,而是通过 nginx代理请求的后端。,并且这个代理 是通过 端口后面的 地址区分,不是通过 端口区分。

  比如 nginx 端口 80 ,ip:80/html 指向 静态资源,ip:80/api 指向 接口服务器。

备注:

Java 后端跨域的设置,具体看你用的什么框架,原理都一样,在 response 里面写点东西。

import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Order(1)
//重点
@WebFilter(filterName = "corsFilter", urlPatterns = {"/*"})
public class CORSFilter implements Filter{

	@Override
    public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("初始化filter==========================");
	}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token,Authorization,ybg");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("filter==========================");
    }
    @Override
    public void destroy() {
    	System.out.println("销毁filter==========================");
    }
}

  

2 nginx 的 跨域设置。

跨域详解 been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

原文地址:https://www.cnblogs.com/cxygg/p/12419502.html

时间: 2024-10-08 04:52:12

跨域详解 been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource的相关文章

As.net WebAPI CORS, 开启跨源访问,解决错误No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource

默认情况下ajax请求是有同源策略,限制了不同域请求的响应. 例子:http://localhost:23160/HtmlPage.html 请求不同源API http://localhost:22852/api/values, What is "Same Origin"? Two URLs have the same origin if they have identical schemes, hosts, and ports. (RFC 6454) These two URLs h

浏览器禁止跨域访问及解决: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.

一.出现报错 二.原因: 1.跨域访问是浏览器做的一个保护机制(html5页面需要浏览器渲染) 2.如果页面所访问的后端没有部署在同一个浏览器也会报错 三.跨域问题的解决方式: A.通过后端访问后端的方式解决.     B.通过页面的漏洞来解决--jsonp(不常用) C.现在浏览器支持cors,当然需要我们后端代码也要支持跨域,springMVC是支持cors 写一个配置类:通过接口WebMvcConfigurer来放行跨区域访问 注意事项: 1.跨区域的路径必须是全路径(URL+端口号) 如

js跨域访问,No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource

js跨域访问提示错误:XMLHttpRequest cannot load http://...... No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 解决方法: 1.如果请求的url是aspx页面,则需要在aspx页面中添加代码:Response.AddHeader("Access-Contro

[转]No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource.&#39;Ajax跨域访问解决方案

原 https://blog.csdn.net/zhoucheng05_13/article/details/53580683 No 'Access-Control-Allow-Origin' header is present on the requested resource. 什么是跨域访问 举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求数据,否则就是不安

ajax跨域处理 No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource 问题

Controller层的类上增加@CrossOrign注解,当前文件的所有接口就都可以被调用 spring注解@CrossOrigin不起作用的原因 1.是springMVC的版本要在4.2或以上版本才支持@CrossOrigin 2.非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题. 3.在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是: 在@RequestMapping注解中没

No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource——Web Api跨域问题

最近使用C#写了一个简单的web api项目,在使用项目中的.cshtml文档测试的时候没有任何问题,但是在外部HBuilder上面编写.html通过Ajax调用web api路径时报错: No 'Access-Control-Allow-Origin' header is present on the requested resource. 导致这个问题的原因是在跨域访问web api的api时,C#自带的web api并不能支持跨域访问,如果需要,可以更改配置来实现. 1.更改Web.con

vue-cli3设置代理跨域详解

老规矩,先上代码 // 在根目录下自行创建vue.config.js module.exports = { // cli3 代理是从指定的target后面开始匹配的,不是任意位置:配置pathRewrite可以做替换 devServer: { port: '8080', open: true, proxy: { '/api': { // /api 的意义在于,声明axios中url已/api开头的请求都适用于该规则, // 注意是以/api开头,即:axios.post({url: '/api/

CORS跨域详解

废话少数,直接上代码!!!!!!!!!! html: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>Document</title>      <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.js"

跨域详解及其常见的解决方式

跨域是什么 跨域是一个域下的网页去请求另一个域下的资源.严格点来说就是两个域的协议.域名.端口任何一个不同时,都会被当作跨域.当跨域访问资源时,会受到浏览器的安全限制,详细的情况可以看下表: URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名 允许 http://www.a.com/a/a.js http://www.a.com/b/b.js 同一域名,不同文件夹 允许 http://www.a.com:3000/a.js