跨域问题解决方案(三种)

这篇具有很好参考价值的文章主要介绍了跨域问题解决方案(三种)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Same Origin Policy同源策略(SOP)

具有相同的Origin,也即是拥有相同的协议、主机地址以及端口。一旦这三项数据中有一项不同,那么该资源就将被认为是从不同的Origin得来的,进而不被允许访问。

Cross-origin resource sharing跨域资源共享(CORS)

是一个W3C标准。允许浏览器向跨源(协议 + 域名 + 端口)服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。它的通信过程,都是浏览器自动完成,不需要用户参与。

对于开发者来说,CORS通信与同源的AJAX/Fetch通信没有差别,代码完全一样。
浏览器一旦发现请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

  • 简单请求:只要在头信息增加一个Origin字段。是HEAD、GET、POST请求,并且HTTP的头信息不超出以下几种字段 Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type。反之,就是非简单请求。
  • 非简单请求:在正式通信之前,增加一次OPTIONS查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

实现CORS很简单,就是在服务端加一些响应头,并且这样做对前端来说是无感知的
跨域问题解决方案(三种),跨域解决方案

如果在开发中,发现每次发起请求都是两条,一次OPTIONS,一次正常请求,注意是每次,那么就需要配置Access-Control-Max-Age,避免每次都发出预检请求。

方法一

全局配置,(很多旧版的WebMvcConfigurerAdapter被标记为过时Deprecated)

@Configuration
public class CorsConfig implements WebMvcConfigurer{
	
	@Override
	public void addCorsMappings(CorsRegistry registry){
		
		registry.addMapping("/**")
			.allowedOrigins("*")
			.allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
			.allowCredentials(true)
			.maxAge(3600)
			.allowedHeaders("*");
	}
}

方法二

基于过滤器方式,在response中写入这些响应头。

@WebFilter(filterName = "CorsFilter")
@Configuration
public class CorsFilter implements Filter{
	
	@Override
	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-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
        chain.doFilter(req, res);
	}
}

方法三

@CrossOrigin注解的方式
注解可以放在method、class等上面,类似RequestMapping,也就是说,整个controller下面的方法可以都受控制,也可以单个方法受控制

public class GoodsController{
	
	@CrossOrigin(origins = "http://localhost:4000")
	@GetMapping("goods-url")
	public Response queryGoodsWithGoodsUrl(@RequestParam String goodsUrl)throws Exception{
		
	}
}

使用Nginx部署前后端分离项目,解决跨域问题

一、nginx.conf中配置

首先配置上游服务器:

# 配置服务端的地址,如果服务端是集群化部署,那么这里就会有多个服务端地址,然后可以通过权重或者 ip hash 等方式进行请求分发
upstream zqq.com{
  server 127.0.0.1:9999 weight=2;
}

server中配置转发规则

location /jinlu/ {
  proxy_pass http://zqq.com;
  tcp_nodelay     on;
  proxy_set_header Host            $host;
  proxy_set_header X-Real-IP       $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这样配置完成后,假设我目前的域名是 javaboy.org,那么用户通过 http://www.javaboy.org/jinlu/** 格式的地址就可以访问到我服务端的接口

二、前端部署

以 Vue 为例,如果是 SPA 应用,项目打包之后,就是一个 index.html 还有几个 js、css、images 以及 fonts
这些都是静态文件,我们将静态文件首先上传到服务器,然后在 nginx.conf 中配置静态资源访问,具体配置如下:

location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff|html|txt|pdf|) {
   root /usr/local/nginx/html/;#所有静态文件直接读取硬盘
   expires 30d; #缓存30天
}

按照资源类型来拦截的,即后缀为 js、css、ico 等的文件,统统都不进行请求分发,直接从本地的 /usr/local/nginx/html/ 目录下读取并返回到前端(我们需要将静态资源文件上传到 /usr/local/nginx/html/ 目录下)

如果服务器上部署了多个项目,这种写法就不太合适,因为多个项目的前端静态文件肯定要分门别类,各自放好的,这个时候我们一样可以通过路径来拦截,配置如下:

location /jinlu-admin/ {
   root /usr/local/nginx/html/jinlu-admin/;#所有静态文件直接读取硬盘
   expires 30d; #缓存30天
}

这样,请求路径是 /jinlu-admin/ 格式的请求,则不会进行请求分发,而是直接从本机的 /usr/local/nginx/html/jinlu-admin/ 目录下返回相关资源。采用这方方式配置静态资源,我们就可以部署多个项目了,多个项目的部署方式和上面的一样

这样部署完成之后,假设我的域名是 javaboy.org ,那么用户通过 http://www.javaboy.org/jinlu-admin/**格式的请求就可以访问到前端资源了。

前端的静态资源和后端的接口现在处于同一个域之中了,这样就不存在跨域问题,所以不必用 JSONP 或者 CORS 去解决跨域。特殊情况可能需要在 nginx 中配置跨域文章来源地址https://www.toymoban.com/news/detail-731817.html

到了这里,关于跨域问题解决方案(三种)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ajax请求跨域问题及其解决方案

            我们的传统请求,比如说超链接、form表单,js代码以及直接在浏览器地址栏上写请求地址都不存在跨域问题,能够从一个网站访问另外一个网站,但是我们的Ajax请求会存在跨域问题,其主要是为了解决跨域访问带来的安全隐患。因为浏览器中有一个内置对象XMLH

    2024年02月06日
    浏览(41)
  • AJAX学习笔记8 跨域问题及解决方案

    AJAX学习笔记7 AJAX实现省市联动_biubiubiu0706的博客-CSDN博客 跨域:指一个域名的网页去请求另外一个域名资源.比如百度页面去请求京东页面资源. 同源与不同源三要素:协议,域名,端口 协议一致,域名一致,端口一致.才算是同源.其他一律不同源 新建项目 测试: 1.window.open(); window.lo

    2024年02月09日
    浏览(34)
  • SpringBoot 解决跨域问题的 5 种方案!

    供学习使用 SpringBoot 解决跨域问题的 5 种方案! 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。但这个保护机制也带来了新的问题,它的问题是给不同站点之间

    2024年02月08日
    浏览(25)
  • 【uniapp】uni.request请求跨域问题解决方案

    例如,运行H5页面,请求一个地址资源,如果不是本站地址,浏览器就会报跨域错误,这样访问受限 例如,项目代码里是这样写的,运行H5测试 因为 https://gitcode.net 不是本站地址,根据浏览器同源策略,是会报跨域错误, 打开项目的 manifest.json 文件,以源码视图查看,添加以

    2024年02月05日
    浏览(31)
  • Spring Boot 解决跨域问题的 5种方案

     跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。 在请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求: 协议不同,如 http 和 https; 域名不同; 端口不同。 也就是说, 即使域名相同,如果一个使用的是

    2024年02月15日
    浏览(28)
  • 跨域问题踩坑记录——附多种报错详细解决方案

    跨域是出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,当一个请求url的 协议、域名、端口 三者之间任意一个与当前页面url不同即为跨域。 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的

    2024年02月04日
    浏览(32)
  • 最新版本chrome浏览器出现的跨域问题及解决方案

    最近将chrome浏览器更新到了最新版本 ,在个别网站上出现了跨域访问问题。 目录 解决办法: (1)增加参数配置代码 (2)重新打开浏览器 在桌面快捷方式中右键》属性》快捷方式中的目标后面加入以下参数配置代码 注意:其中chrome.exe与--disable之间有一个空格 然后重新打

    2024年02月06日
    浏览(37)
  • Redis数据一致性问题的三种解决方案

    Redis(Remote Dictionary Server ),是一个高性能的基于Key-Value结构存储的NoSQL开源数据库。大部分公司采用Redis来实现分布式缓存,用来提高数据查询效率。 在Web应用发展的初期,系统的访问和并发并不高,交互也比较少。但随着业务的扩大,访问量的提升,使得服务器负载和关系

    2024年02月14日
    浏览(28)
  • 前后端分离项目跨域问题No ‘Access-Control-Allow-Origin‘解决方案

    一.问题背景 前后端分离项目跨域问题,浏览器控制台报错: No \\\'Access-Control-Allow-Origin\\\' header is present on the requested resource. 请求方法为OPTIONS,状态值为302或403。 本文解决常见的CORS跨域问题,以及,集成CAS 5.3单点登录内嵌页面时,发送复杂请求产生的跨域问题。 二.解决方案

    2024年02月02日
    浏览(38)
  • nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    提示:本人在生产部署服务时遇到一系列跨域问题和https配置问题,特此做以下记录: 跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包