java - Spring Boot 启用全局 CORS 支持问题 : only GET is working, POST、PUT 和 Delete 不起作用

标签 java spring spring-mvc cors

更新: 现在回顾一年多后,我给出了一个更新,希望能对其他人有所帮助。

Spring IO 建议对普通用户可以通过浏览器处理的任何请求使用 CSRF 保护。如果您只创建非浏览器客户端使用的服务,您可能希望禁用 CSRF 保护。 由于我的应用是一个 API,并且会被浏览器处理,所以禁用 CSRF 不是一种方法。

默认情况下,CSRF 在 Spring Boot 中启用,您需要添加以下代码以添加 CSRF 存储库和过滤器以将 CSRF token 添加到您的 http 请求。 (解决方法来自这里Invalid CSRF Token in POST request)

@Override
protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/assets/**", "/templates/**", "/custom-fonts/**", "/api/profile/**", "/h2/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .logoutSuccessUrl("/login?logout")
                .permitAll()
                .and()
            .csrf().csrfTokenRepository(csrfTokenRepository())
                .and()
            .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter.
               }

filter & CsrfToken Repository 部分:

private Filter csrfHeaderFilter() {
    return new OncePerRequestFilter() {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain filterChain) throws ServletException, IOException {

            CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName());
            if (csrf != null) {
                Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
                String token = csrf.getToken();
                if (cookie == null || token != null
                        && !token.equals(cookie.getValue())) {

                    // Token is being added to the XSRF-TOKEN cookie.
                    cookie = new Cookie("XSRF-TOKEN", token);
                    cookie.setPath("/");
                    response.addCookie(cookie);
                }
            }
            filterChain.doFilter(request, response);
        }
    };
}   


private CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        return repository;
    }

我在 2016 年 2 月提出的原始问题

我致力于为 Spring 4 的 Spring-boot RESTful API 提供全局 CORS 支持。

我正在关注官方 Spring Boot 文档 (https://spring.io/guides/gs/rest-service-cors/) 并将其添加到我的应用程序中:

public class SomeApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(SomeApiApplication.class, args);
    }


    //Enable Global CORS support for the application
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedOrigins("http://localhost:8080")
                        .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD")
                        .allowedHeaders("header1", "header2") //What is this for?
                        .allowCredentials(true);
            }
        };
    }
}

我不明白为什么只有 GET 有效,对于其余的 http 调用,我收到一条错误消息,提示“无效的 CORS 请求”。我错过了设置中的任何内容吗?如果我的设置不正确,GET 也不应该工作。我很困惑。

最佳答案

我遇到了类似的问题,只有 HEAD GET 和 POST 对我有用。 我发现addCorsMappings具有 allowedMethods 的默认值.

此代码适用于我:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedMethods("*")
                        .allowedOrigins("http://localhost:4200");
            }
        };
    }
}

关于java - Spring Boot 启用全局 CORS 支持问题 : only GET is working, POST、PUT 和 Delete 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35315090/

相关文章:

Spring Security 5 身份验证总是返回 302

java - Gradle任务sonarquube在http://localhost:9000/api/settings/values.protobuf上失败并显示401错误

java - ArrayList 与队列时间复杂度

java - 使用 jsoup 将自定义 css 添加到 html 代码

java - 使用 OneToMany 时 Spring 返回一个大字符串而不是 List

java - Spring MVC @ResponseBody 错误

java - java/clojure 是否有条件重启库实现?

java - 在当前项目和插件组中未找到前缀 'jetty' 的插件

java - 在 ExceptionHandler 中确定可接受的内容类型

java - 未定义名为 'CustomAuthenticationProvider' 的 bean