提问者:小点点

如何在不使用Spring Security的情况下解决CORS问题


我有这个WebMvcConfirer,它在部署在服务器上时完全可以正常工作。但是当我尝试从本地服务的Angular项目向服务器发送请求时,我收到以下错误。

从源http://localhost:4200访问https://sub.domain.com/api/staff/logout的XMLHttpRequest已被CORS策略阻止:对预检请求的响应未通过权限改造检查:请求的资源上不存在Access Control Allow-Origin标头。

我的配置如下:

@Configuration
@EnableWebMvc
public class WebMvcConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedOrigins("*")
                        .allowedHeaders("*")
                        .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
                        .allowCredentials(true).maxAge(3600);
            }

            /**
             * To add our interceptor into Spring configuration, we need to override
             * addInterceptors() method WebMvcConfig class that implements WebMvcConfigurer.
             */
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(new AppInterceptor());
            }
        };
    }
}

我已经参考了其他问题,我没有找到任何解决我问题的东西。提前感谢。


共2个答案

匿名用户

在您的Angular应用程序中,您可以添加一个proxy. config.json,它将在本地为您解决CORS问题。此配置仅在本地提供应用程序时才会影响,因此在生产过程中不会发生任何变化。

{
    "/api/*": {
      "target": "http://localhost:8080",
      "secure": false,
      "logLevel": "debug",
      "changeOrigin": false
    }
}

另外,请参阅以下答案:https://stackoverflow.com/a/47537203/9698467和Angular留档:https://angular.io/guide/build#proxying-to-a-backend-server

这个想法是,即使前端和后端都在localhost上提供服务,也有一个本地服务器为Angular应用程序提供服务,一个本地服务器为您的后端提供服务。它们都在不同的端口上提供服务,这导致了跨域问题。通过使用代理,您可以有效地将Angular后端请求路由到localhost:8080,因此从Angular的客户端角度来看,一切似乎都在同一个源上。

匿名用户

因为我将在未来实现Spring Security,尽管问题说没有Spring Security,但我通过将Spring Security添加到项目中来解决这个问题,

启动器依赖项:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

配置类:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.cors.CorsConfiguration;

import java.util.List;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedHeaders(
                List.of("Authorization", "Cache-Control", "Content-Type", "X-PT-SESSION-ID", "NGSW-BYPASS"));
        corsConfiguration.setAllowedOrigins(List.of("*"));
        corsConfiguration
                .setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "PUT", "OPTIONS", "PATCH", "DELETE"));
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setExposedHeaders(List.of("Authorization"));

        http.authorizeRequests().antMatchers("/**").permitAll().anyRequest().authenticated().and().csrf().disable()
                .cors().configurationSource(request -> corsConfiguration);

    }
}

我参考了这个答案,还有其他答案可能对其他人也有帮助。一定要看看。