跨域问题及后端解决方案

跨域问题及后端解决方案

问题产生

跨域问题主要是由于浏览器的同源策略产生:

1.同源策略是什么?
同源策略是一种约定,它是浏览器最核心也最基本的安全功能

2.什么叫同源

同源就是指,域名、协议、端口相同

3.为什么要用呢?
同源策略存在的意义:
在非同源的环境下,用户的隐私数据可以被随意获取
4.同源策略的限制范围?

localhost 调用 127.0.0.1 跨域

http://www.hanny.cn/h.html 调用 http://www.hanny.cn/i.php 非跨域

http://www.hanny.cn/h.html 调用 http://www.john.cn/i.php 跨域了,因为主域已经发生了变化

http://n.hanny.cn/index.html 调用 http://b.john.cn/server.php 跨域了,因为子域名不同

http://www.hanny.cn:8080/h.html 调用 http://www.hanny.cn/i.p 跨域了,因为端口不同

https://www.hanny.cn/s.html 调用 http://www.hanny.cn/i.php 跨域了,协议不同了

后端解决方案

1.加注解@CrossOrigin在类或者方法上

2.添加过滤器

@Component
public class CrosFiter implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
 
    @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");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

3.添加映射

@Configuration
public class GlobalCorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOrigin("*");
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

4.重写WebMvcConfigurer中addCorsMappings方法

  @Bean
    public WebMvcConfigurer MyWebMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
 
                        //放行哪些原始域
                        .allowedOrigins("*")
                        .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                        .allowedHeaders("*")
                        .exposedHeaders("*");
            }
        };

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值