掌握Springboot跨域解决方案的四种方法

需积分: 0 0 下载量 117 浏览量 更新于2024-10-18 收藏 277KB ZIP 举报
资源摘要信息:"Springboot 解决跨域的四种姿势.pdf" Spring Boot是当下流行的Java应用框架,它简化了基于Spring的应用开发过程。而在Web开发中,跨域资源共享(CORS)是一个常见问题,指的是一个域下的资源尝试去访问另一个域下的资源。由于浏览器安全策略,这种跨域访问默认是不被允许的。Spring Boot提供了多种方式来解决跨域问题,以下便是所谓的“四种姿势”。 一、使用 @CrossOrigin 注解 这是最简单的方式,可以在控制器(Controller)的方法上直接使用 @CrossOrigin 注解来允许跨域访问。例如: ```java @CrossOrigin @GetMapping("/example") public ResponseEntity<String> getExample() { return ResponseEntity.ok("Example Response"); } ``` 还可以在类级别使用该注解,以便统一管理跨域设置。 二、使用 WebMvcConfigurer 接口 对于更复杂的跨域需求,可以通过配置WebMvcConfigurer接口的实现类来实现。示例如下: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许跨域的路径 .allowedOrigins("*") // 允许的来源,使用"*"表示接受任何来源 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 允许的HTTP方法 .allowedHeaders("*") // 允许的请求头 .allowCredentials(true) // 是否允许发送Cookie信息 .maxAge(3600); // 预检请求结果缓存的最大时间 } } ``` 通过这种方式,可以为应用中所有端点设置统一的跨域策略。 三、使用 Filter 还可以通过添加一个过滤器(Filter)来处理跨域问题,这样可以在请求到达控制器之前对请求和响应进行处理。一个示例Filter如下: ```java @Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; 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, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN"); if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } } ``` 通过这种方式可以自定义跨域处理逻辑。 四、使用 AbstractAnnotationConfigDispatcherServletInitializer 对于Spring Boot应用,在Web应用初始化时,可以通过继承 AbstractAnnotationConfigDispatcherServletInitializer 类,并重写其方法来设置跨域。 ```java public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setInitParameter("dispatchOptionsRequest", "true"); } @Override protected String[] getServletMappings() { return new String[] { "/" }; } // ... 其他方法的实现 ... } ``` 通过重写 customizeRegistration 方法,可以设置相应的CORS参数。 以上便是Spring Boot解决跨域问题的四种方法,它们各有特点,适用不同的场景。开发者可以根据应用的实际情况选择最适合的方式来解决跨域问题。