提问者:小点点

Spring的错误


我对SpringCors有意见。

我在 chome 上收到此错误:从源“http://localhost:4200”以“http://localhost:8080/api/informationWS”访问 XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“访问控制-允许-源”标头。

我的文件Web安全配置适配器

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {   
    @Autowired
    private LoginService loginService;
    
    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return super.authenticationManager();
    }   
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {   
        auth
            .userDetailsService(loginService)
            .passwordEncoder(this.passwordEncoderAutentication());
    }
    
    @Bean
    public PasswordEncoder passwordEncoderAutentication() {
        String idForEncode = "bcrypt";
        Map<String, PasswordEncoder> encoders = new HashMap<>();
        encoders.put(idForEncode, new BCryptPasswordEncoder());
        encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
        encoders.put("scrypt", new SCryptPasswordEncoder());
         
        PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);
        
        return passwordEncoder;
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.cors();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

我的文件资源服务器配置适配器

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/api/informationWS").permitAll()
            .antMatchers(HttpMethod.POST, "/api/work").authenticated()
            .anyRequest().denyAll();
    }  
}

我试图以以下两种方式与Cors合作,但它们都没有工作,产生了相同的错误

我的文件cors

@Configuration
@EnableWebMvc
public class Cors implements WebMvcConfigurer {

   @Override
    public void addCorsMappings(CorsRegistry registry) {
       registry.addMapping("/**")
            .allowedOrigins("http://localhost:4200");
    }
}

我的文件Cors2

@Configuration
public class Cors {

    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilterFilterRegistrationBean(){
        List<String> host = Arrays.asList("http://localhost:4200");

        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowedOrigins(host);
        corsConfiguration.setAllowedHeaders(Arrays.asList("*"));
        corsConfiguration.setAllowedMethods(Arrays.asList("*"));
        corsConfiguration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/api/**", corsConfiguration);

        CorsFilter corsFilter = new CorsFilter(source);
        FilterRegistrationBean<CorsFilter> filter = new FilterRegistrationBean<>(corsFilter);
        filter.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return filter;
    }
}

共1个答案

匿名用户

您可以尝试/检查的内容:

    < li >检查应用程序代码是否已执行-可能服务器出于某种原因停止执行,因此您的spring代码无法添加标头。 < li >可能有预检请求,但服务器不允许(因此服务器再次停止执行,您的后端代码无法发送标头) < li >也许您自己在添加头之前的某个地方停止了脚本,比如< code > system . exit(0); < li >可能会重定向到不添加标题的代码,例如某些异常 < li >尝试运行来自Postman的请求-您应该不会收到错误,并且您可能会看到一些令人惊讶的内容。 < li >这样做< code >。antMatchers(HttpMethod。GET,"/api/informationWS")真的匹配请求?也许有一种方法只是为了测试而添加通配符,看看是否有效?您正在发送GET请求吗?

更多细节,技术不同但概念相同:https://dariuscoder.com/2021/09/16/how-to-debug-cors/