当前位置: 首页 > 知识库问答 >
问题:

CORS阻塞了上传、删除和发布请求,但是GET正在工作

陶和歌
2023-03-14

我不知所措。我正在尝试配置CORS,并且我已经尝试了在internet/Stack溢出中可以找到的所有东西。

请求在Postman中有效,但在使用公理的React中无效。

以下是我用于删除用户的函数(这在 Postman 中有效,但在 React 中触发时不起作用):

 deleteEmployeeById(id) {
    // return axios.delete(API_BASE_URL + `employees/${id}`);
    var testing = "";
    return axios
      .delete(API_BASE_URL + `employees/${id}`, {
        headers: {
          Authorization: `Bearer ${HARDCODED_JWT_TESTING}`,
        },
      })
      .then("yessssss")
      .catch((error) => {
        console.log("failed to delete  emp by id" + error);
      });
  }
}

我有一个安全配置.java文件,如下所示:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    MyUserDetailsService myUserDetailsService;

    @Autowired
    private JwtRequestFilter jwtRequestFilter;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // TODO : use this line when i implement bcrypt
        // auth.userDetailsService(myUserDetailsService).passwordEncoder(passwordEncoder());
        auth.userDetailsService(myUserDetailsService);

    }

    // TODO : should use this password encoder
    // public PasswordEncoder passwordEncoder() {
    // return new BCryptPasswordEncoder();
    // }

    @Bean
    public PasswordEncoder passwordEncoder() {
        // TODO : not secure. Use a different encoder. testing only
        return NoOpPasswordEncoder.getInstance();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // allow users to access "authenticate" page without being authenticated
        // all other requests must be authenticated
        // stateless tells it to not create a session? Do i need? Not sure yet
        // http.csrf().disable().authorizeRequests().antMatchers("/api/authenticate").permitAll().anyRequest()
        // .authenticated().and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues()).and().csrf()
                .disable().authorizeRequests().antMatchers("/api/authenticate").permitAll().anyRequest().authenticated()
                .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);

    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        // create bean of type 'authenticationManager'
        return super.authenticationManagerBean();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setExposedHeaders(Arrays.asList("X-Auth-Token", "Authorization", "Access-Control-Allow-Origin",
                "Access-Control-Allow-Credentials"));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

}

我不知道错误在哪个函数中,但我假设它是corsConfigurationSource()方法。但是,我看不出这不应该工作的问题。在我尝试为应用程序添加安全性之前,它曾经工作过。

正如您在该方法中看到的,我已经设置了所有允许的方法,我允许所有来源等,但在尝试从我的数据库中删除用户时仍然会出现此错误:

Access to XMLHttpRequest at 'http://localhost:8080/api/employees/6151c89ea1b79f789a7a964b' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

不过,这在邮递员中确实有效。我可以删除用户没有问题,它只是在从我的前端React应用程序触发时无法正常工作。

看起来我允许CORS中的所有内容,任何想法还有什么需要配置的??

共有2个答案

那弘
2023-03-14

为了更好地清晰和测试,您可以尝试通过以下方法测试您的corsConfigurationSource()。请根据您的应用程序更改代码,例如源代码等。

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
    configuration.setAllowedMethods(Arrays.asList("*"));
    configuration.setAllowedHeaders(Arrays.asList("*"));
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

它基本上允许所有标头,方法和源。它不适合生产,但出于测试目的,您可以尝试一下。

景远航
2023-03-14

尝试在实例化CorsConfiguration后删除. applyPermitDefaultValue()中的SecurityConfig调用。这基本上是将CORS配置重置为默认值:

  • 允许所有具有CORS规范中定义的特殊值“*”的原点。只有在既没有设置原点也没有设置originPatterns的情况下才设置此选项
  • 允许使用“简单”方法GET、HEAD和POST
  • 允许所有标题
  • 将最大年龄设置为1800秒(30分钟)

此外,调用配置Source() 方法,而不是实例化新的配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().configurationSource(corsConfigurationSource()).and().csrf()
            .disable().authorizeRequests().antMatchers("/api/authenticate").permitAll().anyRequest().authenticated()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
}

此外,按如下方式更新您的CorsConfigurationSource

@Bean
CorsConfigurationSource corsConfigurationSource() {
    final CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));
    configuration.setAllowedMethods(Arrays.asList("HEAD", "GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"));
    configuration.setAllowCredentials(true);
    configuration.setAllowedHeaders(Arrays.asList("*"));
    configuration.setExposedHeaders(Arrays.asList("X-Auth-Token", "Authorization", "Access-Control-Allow-Origin",
            "Access-Control-Allow-Credentials"));
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}
 类似资料:
  • 我在组件中有这个函数,它应该向express API发送POST请求: 这是向其发送请求的API: 我还要求在express,app.js文件中使用neccessary CORS依赖项 API路由运行良好,当我确实获得请求时,但是,当我执行post请求时,我总是得到这个错误: 未能加载http://localhost:3000/api/v1/addcomment:对飞行前请求的响应未通过访问控制检

  • 试图将axios post请求从Vue应用程序(localhost)发送到我的nodejs API(localhost和heroku)。 如果请求是在没有数据或头的情况下发送的,则接收响应不会有问题,但是当我添加它们时,我会收到以下错误: 我已经尝试了不同的选择,服务器端和客户端,建议类似的问题,但没有成功。 客户端请求: 服务器endpoint: 我尝试了一些答案: 对预飞行请求的响应没有通过访

  • 当我使用离子服务时,我不断收到以下错误。。。 对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许来源”标头。起源http://localhost:8100因此不允许访问。 它只出现在“post”请求中。我的“get”请求没有任何错误。我看过代理的文档,但我并不打算走这条路。我目前正在使用CORS Chrome插件作为解决办法,但很快将会运送到移动设备(离子视图)进行测试,我相信

  • 每当我尝试使用axios发送删除endpoint的请求时,都会出现以下错误: 通过CORS策略阻止从源http://localhost:3000在http://localhost:8080/api/payment_card/delete/1234123412343433处访问XMLHttpRequest:对预检请求的响应未通过权限改造检查:请求的资源上不存在“Access-Control-Allo

  • 我有一个问题。 我正在尝试设置简单的服务器,它将从传感器向mySQL发送数据。路径/bezp/数据。php?当我在web brower中执行此操作时,temperature=“number”正在工作。我还可以在串行监视器中看到文本“connected”,所以它会输入IF,但数据库仍然不会更新。 Arduino代码: 此外,温度传感器正在工作,我正在调用另一个文件中的函数。