📜  cors spring 方法或类 - Java (1)

📅  最后修改于: 2023-12-03 15:00:02.279000             🧑  作者: Mango

CORS Spring 方法或类 - Java

CORS(跨域资源共享)是一种用于 Web 应用程序的机制,用于允许一个 Web 首页的代码或 JavaScript 获得不在同一来源(域、端口或协议)下的访问权限。

在 Spring 中,有多种方法和类可用于处理 CORS。

配置 CORS

您可以通过配置 CorsRegistry 对象来启用 CORS。您只需要创建一个带有 @Configuration 注释的类,并在其中使用 addMapping() 方法来指定您希望允许跨域的端点和 HTTP 方法,并配置要使用的跨域设置。

@Configuration
public class CorsConfiguration {
 
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/api/**")
                        .allowedOrigins("*")
                        .allowedMethods("GET", "POST", "PUT", "DELETE")
                        .allowedHeaders("*")
                        .maxAge(3600);
            }
        };
    }
 
}

在上面的示例中,我们定义了一个 /api/** 端点,它允许任何来源(allowedOrigins("*"))的 HTTP GET、POST、PUT 和 DELETE 请求(allowedMethods("GET", "POST", "PUT", "DELETE")),允许任何标头(allowedHeaders("*")),并设置了 Max-Age 为一小时(maxAge(3600))。

使用 @CrossOrigin 注释

您还可以使用 @CrossOrigin 注释来指定允许跨域请求的方式和源。您可以将此注释用于控制器方法或控制器类。

@RestController
@CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})
public class UserController {
 
    @GetMapping("/users")
    public List<User> getUsers() {
        // ...
    }
 
    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        // ...
    }
 
}

在上面的示例中,我们定义了一个 REST API,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求。

使用 WebMvcConfigurerAdapter

在旧版本的 Spring 中,您可以使用 WebMvcConfigurerAdapter 来配置 CORS。但是,WebMvcConfigurerAdapter 在 Spring 5.0 中已被弃用。

@Configuration
public class CorsConfiguration extends WebMvcConfigurerAdapter {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .maxAge(3600);
    }
 
}

在上面的示例中,我们定义了一个 /api/** 端点,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求。

使用 CorsFilter

如果您使用的是 Servlet API,则可以使用 CorsFilter 来处理 CORS。CorsFilter 是一个简单的过滤器,它允许您轻松地处理跨域请求。

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
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", "GET, POST, PUT, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
 
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ...
    }
 
    @Override
    public void destroy() {
        // ...
    }
 
}

在上面的示例中,我们定义了一个 CorsFilter 过滤器,它允许任何来源的 HTTP GET、POST、PUT 和 DELETE 请求,允许授权标头和内容类型标头。

结论

在本文中,我们提供了几种用于处理 CORS 的方法和类。您可以选择适合自己的方式来启用跨域请求。无论您选择哪种方式,都应该主动考虑安全性问题。如果您允许来自任何来源的跨域请求,在某些情况下可能会导致安全漏洞。