Spring boot 跨域 后台配置
Spring boot web开发,一般采取 前后端分离
前后端分离就会涉及到跨域问题,Spring boot 提供进行后台跨域配置,允许具体跨域详细配置
方法一:注册配置类 设置 跨域问题
自定义 CorsConfig类如下
1 @Configuration 2 public class CorsConfig { 3 private CorsConfiguration buildConfig() { 4 CorsConfiguration corsConfiguration = new CorsConfiguration(); 5 //允许所有的域访问 6 corsConfiguration.addAllowedOriginPattern("*"); 7 //允许的头信息 8 corsConfiguration.addAllowedHeader("*"); 9 //允许所有方式的请求 10 corsConfiguration.addAllowedMethod("*"); 11 //头信息缓存有效时长 12 corsConfiguration.setMaxAge(18000L); 13 corsConfiguration.setAllowCredentials(true); 14 15 return corsConfiguration; 16 } 17 18 @Bean 19 public CorsFilter corsFilter() { 20 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 21 source.registerCorsConfiguration("/**", buildConfig()); 22 return new CorsFilter(source); 23 }
方法二 重载 HandlerInterceptorAdapter 实现 跨域配置
在HandlerInterceptorAdapter中主要提供了以下的方法:
preHandle:在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true,则继续调用下一个拦截器。如果返回false,则中断执行,也就是说我们想调用的方法不会被执行,但是你可以修改response为你想要的响应。
postHandle:在方法执行后调用。
afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
1 @Component 2 @Order(Ordered.HIGHEST_PRECEDENCE) 3 public class CrosInterceptor extends HandlerInterceptorAdapter { 4 5 @Override 6 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { 7 // 此处配置的是允许任意域名跨域请求,可根据需求指定 8 9 //允许所有的域访问 10 response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin")); 11 //允许所有方式的请求 12 response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, OPTIONS"); 13 14 response.setHeader("Access-Control-Allow-Credentials", "true"); 15 //头信息缓存有效时长(如果不设 Chromium 同时规定了一个默认值 5 秒),没有缓存将已OPTIONS进行预请求 16 response.setHeader("Access-Control-Max-Age", "18000"); 17 //允许的头信息 18 response.setHeader("Access-Control-Allow-Headers", "*"); 19 20 // 如果是OPTIONS则结束请求 21 if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) { 22 response.setStatus(HttpStatus.NO_CONTENT.value()); 23 return false; 24 } 25 26 return true; 27 }
备注说明:本人刚开始学些Spring boot 相关知识,看到同事这样的,但是从个人理解来说,方法二是在拦截器 里面写的,可能有问题,需要验证。