SpringBoot 跨域解决

跨域:

域:协议 + 域名 + 端口;三者完全相同则为同域,反之有其一不同均为不同域。
跨域请求:

    当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求。跨域请求是能访问到服务端的,但因为浏览器出于安全性考虑,有一个同源策略控制,请求被服务处理了。只不过返回的响应内容被浏览器拦截掉了

同源限制:浏览器针对跨域请求做出同源限制资源访问:

  1. Cookie、LocalStorage 和 IndexDB 无法跨域访问;
  2. DOM元素无法跨域访问;
  3. Ajax无法跨域请求。

解决跨域的方式有大致,分为三种:

  1. 前端解决:如:JSONP
  2. 后端:
    1. 基于注解@CrossOrigin对某个或某些请求拦截
    2. 编写跨域过滤类
  3. 使用中间件:NIGINX做反向代理进行跨域处理(推介

以下提供设置全局跨域处理配置类,网上一大堆自行百度。

原理:在response响应头里加上允许跨域的参数,代码如下:

package com.spring.jpa.controller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

  @Bean
  public CorsConfiguration corsConfiguration() {
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    //实际请求中允许携带的首部字段
    corsConfiguration.addAllowedHeader("*");
    //允许那些域跨域访问
    corsConfiguration.addAllowedOrigin("*");
    //允许那些请求方法
    corsConfiguration.addAllowedMethod("*");
    return corsConfiguration;
  }

  @Bean
  public CorsFilter corsFilter(CorsConfiguration corsConfiguration) {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", corsConfiguration); // 4
    return new CorsFilter(source);
  }

}
import javax.servlet.*;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  
   
@Component  
public class CorsFilter implements Filter {  
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        //为response填充头部信息,实现跨域正常返回
        HttpServletResponse response = (HttpServletResponse) res;  
        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");  
        chain.doFilter(req, res);  
    }  
    public void init(FilterConfig filterConfig) {}  
    public void destroy() {}  
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值