跨域问题如何解决

1.什么是跨域

跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

2.什么是同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。

可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同

3.非同源的限制

  • cookie不能读取 
  • dom无法获得
  • ajax请求不能发送

4.如何解决跨域问题

4.1使用@CrossOrigin

是springMVC的版本要在4.2或以上版本才支持@CrossOrigin,将注解放在类上或者方法上

/**
 * @author wangli
 * @data 2022/3/23 17:13
 * @Description:黑名单控制器
 */
@RestController
@RequestMapping("/blacklist")
@Api("黑名单控制器")
@CrossOrigin
public class BlackListController {
    @Autowired
    private BlackListService blackListService;

    @Autowired(required = false)
    private BlackListMapper blackListMapper;

    @PostMapping("/saveBlackList")
    @ApiOperation(value = "加入黑名单 wangli",notes = "加入黑名单 wangli",response = StandardResult.class)
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "body",name = "BlackListModel",value = "黑名单模型",required = true,dataType = "QuestionModel")
    })
    public StandardResult saveQuestion(@RequestBody BlackListModel blackListModel) {
        try {
            if (blackListModel.getUserId() == null) {
                blackListModel.setUserId(UserHolder.getUserId());
            }
            blackListService.save(blackListModel);
            return StandardResult.ok();
        } catch (Exception e) {
            return StandardResult.faild(e);
        }
    }

其中@CrossOrigin中的2个参数:

origins  : 允许可访问的域列表

maxAge:准备响应前的缓存持续的最大时间(以秒为单位)。

2.基于过滤器

package com.atguigu.gateway.config;
/**
 * <p>
 * 处理跨域
 * </p>
 *
 * @author wangli
 * @since  2021-11-21
 */

@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new         UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

3.使用全局配置

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

您可以轻松地更改任何属性,以及仅将此CORS配置应用到特定的路径模式:

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
        .allowedOrigins("http://domain2.com")
        .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
        .exposedHeaders("header1", "header2")
        .allowCredentials(false).maxAge(3600);

3.整合gataway

@Configuration
public class ZspMallCorsConfig {
    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);

        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsWebFilter(source);
    }
}

 corsConfiguration.addAllowedHeader(""); :允许所有请求头
corsConfiguration.addAllowedMethod(""); :允许所有请求方法,例如get,post等
corsConfiguration.addAllowedOrigin("*");允许所有的请求来源
corsConfiguration.setAllowCredentials(true); 允许携带cookie
source.registerCorsConfiguration("/**",corsConfiguration); 对所有经过网关的请求都生效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨会停rain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值