[跨域问题]

跨域问题

  • 前后端分离的技术跨域问题是最明显的,根本原因是浏览器受到同源策略的限制,是浏览器行为(请求到达服务器但是返回时被浏览器限制)
  • 开发中前端工程使用 webpack 启了一个服务,所以前后端并不在一个端口下,必然涉及到跨域
  • 跨域问题的原因是同源策略,也即脚本只能访问相同协议 / 相同主机名 / 相同端口的资源(不同域名端口和协议之间不能共享资源), 如果要突破这个限制, 那就是所谓的跨域, 此时需要遵守 CORS(Cross-Origin Resource Sharing) 机制
  • 访问类型为==xhr(XMLHttpRequest)==的才会出现跨域

跨域分类

跨域解决

简单请求 Simple Request

发起的Http请求符合:

  • 1.无自定义请求头,
  • 2.请求动词为GET、HEAD或POST之一,
  • 3.动词为POST时,Content-Type是application/x-www-form-urlencoded,
    multipart/form-data或text/plain之一

预检请求 Preflighted Request

发起的Http请求符合其中之一:

  • 1.包含了自定义请求头,
  • 2.请求动词不是GET、HEAD或POST,
  • 3.动词是POST时, Content-Type不是application/x-www-form-urlencoded,
    multipart/form-data或text/plain。 即:简单请求的相反

凭证请求 Requests with Credential

发起的Http请求中带有凭证

前端解决方案

  • 可以对浏览器设置进行修改解决跨域问题,是一些web安全的配置失效
    • 使用jsnop解决跨域,让服务端不返回JSON数据返回一段JS代码传入回调函数

后端解决方案

服务器修改

  • 可以在基于apache和nginx的服务器的代码上做一定的修改
  • 可以做基于nginx的反向代理

CORS

  • W3C组织制定了一个Cross-Origin Resource Sharing规范,简写为Cors,现在这个规范已经被大多数浏览器支持处理跨域需求
SpringBoot2.x配置Cors

pringBoot2.x主要提供了两种方式来支持Cors,

  • @CrossOrigin注解,作用于一个Controller中全部接口或是其中一个特定的接口用于配置、定制特定的请求接口
  • WebMvcConfigurer对象,作用于全部接口,适用于全局配置
使用@CrossOrigin注解
		@RestController
		@RequestMapping(value = "/api/users")
		@CrossOrigin
		public class UsersController{
		
		    @Autowired
		    private UsersService usersService;
		
		    @PostMapping
		    @CrossOrigin
		    public User create(@RequestBody User user) {
		        return userService.save(user);
		    }
		}
使用WebMvcConfigurer对象
		@Configuration
		public class MyConfiguration {
		
			@Bean
			public WebMvcConfigurer corsConfigurer() {
				return new WebMvcConfigurer() {
					@Override
					public void addCorsMappings(CorsRegistry registry) {
						registry.addMapping("/api/**")
						          .allowedOrigins("*")  
						          .allowCredentials(true)
						          .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH")
						          .maxAge(3600);  
					}
				};
			}
		}

重要的方法类:CorsRegistry (方法名:addMapping),属于SpringBoot配置用于配置支持跨域的路径

PHPStudy 中遇到跨域问题通常是由于浏览器的安全策略限制,不允许来自本地服务器(如 PHPStudy)的请求访问其他域名下的资源。当你尝试通过 PHPStudy 发起 AJAX 请求或者其他前端脚本去访问不在同一域内的 API 或静态文件时,浏览器会阻止这种请求以防止潜在的安全威胁。 解决 PHPStudy 跨域问题可以采取以下几种方法: 1. **允许 CORS**(Cross-Origin Resource Sharing):在目标服务器上设置响应头,添加 `Access-Control-Allow-Origin` 字段,指定允许哪些源发起请求。例如,可以在 Apache 或 Nginx 配置文件中设置 CORS。 2. **JSONP**(JSON with Padding):如果目标服务支持 JSONP,那么可以在 PHP 文件里动态生成 `<script>` 标签,通过 URL 参数传递回调函数名。 3. **代理设置**:在 PHPStudy 中,可以在配置的 HTTP 代理设置里,将所有请求转发到目标服务器,从而绕过浏览器的同源策略。 4. **本地服务器反向代理**:使用 PHPStudy 自带的或者第三方工具(如 Fiddler 或Charles)设置一个本地代理服务器,所有的跨域请求都先发送给这个代理,代理再转发到真实的目标服务器。 5. **使用 No-Cache 头部**:有些服务器端框架提供选项,可以临时关闭浏览器缓存,使得每次请求都会从服务器获取最新的内容。 在处理跨域问题时,还要注意安全性和隐私保护,尽量不要随意开放 CORS 权限,只对必要的请求开放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值