SpringBoot 解决跨域问题

导读:本篇文章讲解 SpringBoot 解决跨域问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

一 什么是跨域

二 CORS 协议

三 CORS 协议常见 header 配置

四 SpringBoot 解决跨域方案

4.1 重写 WebMvcConfigurer

4.2 使用注解

4.3 实现过滤器

五 参考文档


一 什么是跨域

       跨域是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。同一协议,同一ip,同一端口,三同中有一不同就产生了跨域。

二 CORS 协议

       CORS 是一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。它通过服务器增加一个特殊的 Header[Access-Control-Allow-Origin] 来告诉客户端跨域的限制,如果浏览器支持 CORS、并且判断 Origin 通过的话,就会允许 XMLHttpRequest 发起跨域请求。

三 CORS 协议常见 header 配置

  • Access-Control-Allow-Origin: http://a.com 表示允许 http://a.com 发起跨域请求。
  • Access-Control-Max-Age: 86400表示在86400秒内不需要再发送预校验请求。
  • Access-Control-Allow-Methods: GET、POST、PUT、DELETE 表示允许跨域请求的方法。
  • Access-Control-Allow-Headers: content-type 表示允许跨域请求包含 content-type。

四 SpringBoot 解决跨域方案

4.1 重写 WebMvcConfigurer

       在配置类中,返回一个新的 WebMvcConfigurer Bean,并重写其提供的跨域请求处理的接口,目的是添加映射路径和具体的CORS 配置信息。

@Configuration
public class GlobalCorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            //重写父类提供的跨域请求处理的接口
            public void addCorsMappings(CorsRegistry registry) {
                //添加映射路径
                registry.addMapping("/**")
                        //放行哪些原始域
                        .allowedOrigins("*")
                        //是否发送Cookie信息
                        .allowCredentials(true)
                        //放行哪些原始域(请求方式)
                        .allowedMethods("GET","POST", "PUT", "DELETE")
                        //放行哪些原始域(头部信息)
                        .allowedHeaders("*")
                        //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
                        .exposedHeaders("Header1", "Header2");
            }
        };
    }
}

4.2 使用注解

       在 Controller 类上使用注解 @CrossOrigin

@Controller
@CrossOrigin(origins = "http://domain.com", maxAge = 3600)
public class AccountController {

    @RequestMapping("/hello")
    @ResponseBody
    public String index( ){
        return "Hello World";
    }
}

4.3 实现过滤器

@Component  
public class CorsFilter implements Filter {  
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;  
        response.setHeader("Access-Control-Allow-Origin", "*");  
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, GET");  
        response.setHeader("Access-Control-Max-Age", "3600");  
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");  
        chain.doFilter(req, res);  
    }  
    @Override
    public void init(FilterConfig filterConfig) {}  

    @Override
    public void destroy() {}  
} 

五 参考文档

       https://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/htmlsingle/#boot-features-cors

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/9586.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!