springMVC 跨域问题解决方案

什么是跨域

跨域问题是由同源策略引发,同源策略浏览器重要的安全策略,浏览器限制跨源http请求;源有三部分组成,协议、主机、端口号;跨源的http请求即为跨域。

什么是CORS

英文全称 Cross-origin Resource Sharing,即 跨源资源共享CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。

Spring MVC支持CORS
  • Spring MVC 跨源资源共享的过程

Spring MVC HandlerMapping的实现类提供了内置支持CORS的功能。在成功将请求映射到处理程序之后,HandlerMapping实现会检查给定请求和处理程序的CORS配置,并采取进一步的处理;预检请求将直接处理,而简单和实际的CORS请求将被拦截、验证并设置所需的CORS响应头。

  • Spring MVC中CORS的配置方法

    • @CrossOrigin 注解 用于方法或类,局部配置

      //同于方法上
      @RestController
      @RequestMapping("/account")
      public class AccountController {
      
          @CrossOrigin
          @GetMapping("/{id}")
          public Account retrieve(@PathVariable Long id) {
              // ...
          }
      
          @DeleteMapping("/{id}")
          public void remove(@PathVariable Long id) {
              // ...
          }
      }
      

      @CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
      @RestController
      @RequestMapping("/account")
      public class AccountController {
      
          @GetMapping("/{id}")
          public Account retrieve(@PathVariable Long id) {
              // ...
          }
      
          @DeleteMapping("/{id}")
          public void remove(@PathVariable Long id) {
              // ...
          }
      }
      
    • 实现WebMvcConfigurer类,重写addCorsMappings方法完成全局配置

      @Configuration
      @EnableWebMvc
      public class WebConfig implements WebMvcConfigurer {
      
          @Override
          public void addCorsMappings(CorsRegistry registry) {
      
              registry.addMapping("/api/**") 
                  .allowedOrigins("https://domain2.com")
                  .allowedMethods("PUT", "DELETE")
                  .allowedHeaders("header1", "header2", "header3")
                  .exposedHeaders("header1", "header2")
                  .allowCredentials(true).maxAge(3600);
      
              // Add more mappings...
          }
      }
      
      • 配置CorsFilter对象

        
        @Configuration
        public class CorsConfig {
           @Bean
           public CorsFilter  corsFilter() {
               CorsConfiguration config = new CorsConfiguration();
               // 允许cookies跨域
               config.setAllowCredentials(true); 
               // #允许向该服务器提交请求的URI,*表示全部允许,自定义可以添加多个,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
               config.addAllowedOrigin("*");
               // #允许访问的头信息,*表示全部,可以添加多个
               config.addAllowedHeader("*");
               // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
               config.setMaxAge(1800L);
               // 允许提交请求的方法,*表示全部允许,一般OPTIONS,GET,POST三个够了
               config.addAllowedMethod("*");
               UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
               //对所有接口都有效
               source.registerCorsConfiguration("/**", config);
               return new CorsFilter(source);
           }
        }
        
        
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值