SpringBoot设置允许跨域请求

网友投稿 697 2022-10-28

SpringBoot设置允许跨域请求

SpringBoot设置允许跨域请求

跨域

一个资源会发起一个跨域HTTP请求(Cross-site HTTP request), 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时 。比如说,域名A(Web 应用程序中通过标签引入了域名B(Web 应用就会导致浏览器发起一个跨站 HTTP 请求。在当今的 Web 开发中,使用跨站 HTTP 请求加载各类资源(包括CSS、图片、JavaScript 脚本以及其它类资源),已经成为了一种普遍且流行的方式。正如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨站请求。更多说明查看:全称为 Cross Origin Resource Sharing(跨域资源共享),服务端只需添加相关响应头信息,即可实现客户端发出 AJAX 跨域请求。

允许跨域配置

配置-(实现WebMvcConfigurer 接口)

//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

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 { } }); } }

配置过滤器

@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); } }

配置局部跨域

@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:允许访问的客户端域名,例如:*,则表示从任意域都能访问,即不做任何限制。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:允许客户端访问的服务端响应头,多个响应头用逗号分割。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于@Controller和@Restcontroller的那点奇葩事
下一篇:jboot-admin- 基于 jboot 微服务的后台管理框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~