首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringBoot设置允许跨域请求

SpringBoot设置允许跨域请求

作者头像
共饮一杯无
发布2022-11-28 16:29:33
发布2022-11-28 16:29:33
1.2K0
举报

跨域

一个资源会发起一个跨域HTTP请求(Cross-site HTTP request), 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时 。比如说,域名A(http://domaina.example)的某 Web 应用程序中通过标签引入了域名B(http://domainb.foo)站点的某图片资源(http://domainb.foo/image.jpg),域名A的那 Web 应用就会导致浏览器发起一个跨站 HTTP 请求。在当今的 Web 开发中,使用跨站 HTTP 请求加载各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源),已经成为了一种普遍且流行的方式。正如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求。 更多说明查看:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

CROS

CORS 全称为 Cross Origin Resource Sharing(跨域资源共享),服务端只需添加相关响应头信息,即可实现客户端发出 AJAX 跨域请求。

允许跨域配置

配置拦截器(实现WebMvcConfigurer 接口)

代码语言:javascript
复制
//springboot 2.0以上的方式
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedHeaders("Content-Type","X-Requested-With","accept,Origin","Access-Control-Request-Method","Access-Control-Request-Headers","token")
                .allowedMethods("*")
                .allowedOrigins("*")
                .allowCredentials(true);
    }
}

配置拦截器实现跨域方式2

代码语言:javascript
复制
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                response.addHeader("Access-Control-Allow-Origin", "*");
                response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                //请求头中的自定义字段是不允许跨域需要配置此配置或者配置response.addHeader("Access-Control-Allow-Headers", "*");
                response.addHeader("Access-Control-Allow-Headers",
                        "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,token");               
                return true;
            }
 
            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
 
            }
 
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
 
            }
        });
    }
 
}

配置过滤器

代码语言:javascript
复制
@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
          config.addAllowedOrigin("*");
          config.setAllowCredentials(true);
          config.addAllowedMethod("*");
          config.addAllowedHeader("*");
          config.addExposedHeader("*");

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

        return new CorsFilter(configSource);
    }
}

配置局部跨域

代码语言:javascript
复制
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/hello")
public class HelloController {

    @CrossOrigin("http://domain2.com")
    @RequestMapping("/{id}")
    public void retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

参数说明

Access-Control-Allow-Origin:允许访问的客户端域名,例如:http://web.xxx.com,若为 *,则表示从任意域都能访问,即不做任何限制。 Access-Control-Allow-Methods:允许访问的请求类型,多个请求类型用逗号分割,例如GET,POST,PUT,DELETE,OPTIONS。 Access-Control-Allow-Credentials:是否允许请求带有验证信息,若要获取客户端域下的 cookie 时,需要将其设置为 true。 Access-Control-Allow-Headers:允许服务端访问的客户端请求头,多个请求头用逗号分割,例如:Content-Type。 Access-Control-Expose-Headers:允许客户端访问的服务端响应头,多个响应头用逗号分割。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 跨域
  • CROS
  • 允许跨域配置
    • 配置拦截器(实现WebMvcConfigurer 接口)
    • 配置拦截器实现跨域方式2
    • 配置过滤器
    • 配置局部跨域
    • 参数说明
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档