-
Spring Boot 服务 跨越访问策略
-
什么是 CORS
- 指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略
- 如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。
-
跨域的解决方案 - 前端的解决方案
- 使用JSONP方式实现跨域调用;
- 使用NodeJS服务器做为服务代理,前端发起请求到NodeJS服务器, NodeJS服务器代理转发请求到后端服务器;
- 设置浏览器允许跨域访问,如Chrome浏览器设置–disable-web-security属性, 该方案仅适用于开发环境 下的开发调试
-
跨域的解决方案 - 后端的解决方案 :以 Spring Boot 跨越配置 为例
-
使用Filter设置服务端返回的Response Header 的Access-Control-Allow-Origin属性,允许跨域访问
@WebFilter public class CorsFilter implements Filter { // 日志对象 private static Logger logger = LoggerFactory.getLogger(CorsFilter.class); @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 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) { // something init } public void destroy() { // destroy something } }
-
使用@CrossOrigin注解,在需要跨域访问的类和方法中设置允许跨域访问;
@RequestMapping(value = "/v1/users") @RestController @CrossOrigin public class UserController extends BaseController { @Autowired private UserService userService; @RequestMapping(method = RequestMethod.POST) @CrossOrigin @RequestBody public User create(@Validated User user) { return userService.save(user); } }
-
继承 Spring Web的 CorsFilter : 适用于Spring MVC、Spring Boot
@Component public class CustomCorsFilter extends CorsFilter { public CustomCorsFilter() { super(configurationSource()); } private static UrlBasedCorsConfigurationSource configurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.setMaxAge(36000L); config.setAllowedMethods(Arrays.asList("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/v1/**", config); return source; } }
-
重写 WebMvcConfigurer接口中的 addCorsMappings 方法(适用于Spring Boot)
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "DELETE", "PUT","PATCH") .maxAge(3600); } }
-
手动实例化 CorsFilter 类,代替SpringBoot自动配置
@Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); //允许任何域名 corsConfiguration.addAllowedHeader("*"); //允许任何头 corsConfiguration.addAllowedMethod("*"); //允许任何方法 return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); //注册 return new CorsFilter(source); } }
-
-
Spring Boot 服务 跨越访问策略
最新推荐文章于 2024-06-27 09:35:59 发布
本文介绍了CORS的概念,由浏览器同源策略引起的跨域访问问题,并提供了前端和后端的解决策略。在Spring Boot中,可以通过设置Filter、使用@CrossOrigin注解或者重写WebMvcConfigurer接口的方法来实现跨域访问配置。
摘要由CSDN通过智能技术生成