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

Cors错误与后映射在Spring引导

锺离赤岩
2023-03-14

我有一个带rest控制器的Spring启动应用程序和一个Angular应用程序作为前端。目前,它们都在本地主机上运行,SpringSecurity在Spring中启用。最初,由于Cors,我无法从Angular向Spring发出getRequest。我将@CrossOrigin添加到我的restContoller中,现在我可以执行从angular到Spring的Get请求。现在我在post请求中也遇到了同样的问题。我想将一些表单数据从angular发送到Spring,但我总是在Chrome中出错。我在这里也添加了@CrossOrigin,但我仍然有这个问题。如果我试着向邮递员发帖,效果会很好

zone.js:3243从localhost:8080/rest/contacthttp://localhost:4200访问XMLHttpRequest已被CORS策略阻止:跨源请求仅支持协议方案:超文本传输协议,数据,铬,铬扩展,https。

contact.component.ts:51错误响应

这是我的安全配置:

@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected void configure (AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
        .passwordEncoder(getPasswordEncoder());
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http
                .authorizeRequests()
                .antMatchers("/admin/**").authenticated()//.hasAnyRole("ADMIN","USER")
                .and().formLogin().loginPage("/login").permitAll()
                .and().logout();
        http.csrf().disable();
        //http.headers().frameOptions().disable();
    }


    private PasswordEncoder getPasswordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }

            @Override
            public boolean matches(CharSequence charSequence, String s) {

                return encode(charSequence).equals(s);
            }
        };
    }
}

我的Cors配置:

@Configuration
public class CorsConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

我的Rest控制器:

@RestController()
@CrossOrigin(origins = "http://localhost:4200/**", maxAge = 3600)
public class GymRestController {

    private final GymRepository gymRepository;

    GymRestController (GymRepository gymRepository) {
        this.gymRepository = gymRepository;
    }

    @GetMapping("/rest/gyms")
    public List<Gym> findAll() {
        return gymRepository.findAll();
    }

    @PostMapping ("/rest/contact")
    public void submitContact(@RequestBody ContactForm contactForm) {
        System.out.println(contactForm);

    }
}

还有我的上交方式

  onSubmit() {
    this.submitted = true;

    if (this.messageForm.invalid) {
        return;
    }

    this.success = true;

    this.contactModel.fromName = this.messageForm.get('name').value;
    this.contactModel.fromMail = this.messageForm.get('email').value;
    this.contactModel.subject = this.messageForm.get('subject').value;
    this.contactModel.message = this.messageForm.get('message').value;

    let url = "http://localhost:8080/rest/contact";
    // let url = "https://cors.io/?localhost:8080/rest/contact"
    this.http.post(url, this.contactModel).subscribe(
      res => console.log("success"),
      error => console.log(error),
      () => console.log("complete")
    );


  }

我已经试了三天来让这个工作没有任何运气任何帮助将不胜感激

共有2个答案

籍永安
2023-03-14

以下是Spring io链接:https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

如果您使用的是Spring Boot,建议只声明WebMvcConfigurer bean,如下所示:

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

您可以轻松更改任何属性,也可以仅将此CORS配置应用于特定的路径模式:

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
        .allowedOrigins("http://domain2.com")
        .allowedMethods("PUT", "DELETE","POST")
            .allowedHeaders("header1", "header2", "header3")
        .exposedHeaders("header1", "header2")
        .allowCredentials(false).maxAge(3600);
}

上面你可以替换http://domain2.com使用您的本地主机或所需的主机/url。

洪捷
2023-03-14

我终于找到了解决办法。我必须在Spring Security中启用cors并禁用csrf

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .cors().and()
            .authorizeRequests()
            .antMatchers("/admin/**").authenticated()//.hasAnyRole("ADMIN","USER")
            .and().formLogin().loginPage("/login").permitAll()
            .and().logout();
    http.csrf().disable();
    http.headers().frameOptions().disable();
}

我不得不从控制器中删除@CrossOrigin,并添加了以下配置:

@Configuration
public class CorsConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowedMethods("*")
                        .allowedOrigins("http://localhost:4200");
            }
        };
    }
}
 类似资料:
  • 请帮助我在Spring启动应用程序,它不工作。我太紧张了。 文件夹列表 null 导入org.springframework.boot.springapplication;导入org.springframework.boot.autocigure.springbootapplication MainController类: 包装控制器; 和错误消息: 并且在资源/模板中有一个index.htm文件

  • 我为所有源和头启用了cors,但当我从angular应用程序调用方法到spring Boot时,仍然会出现cors错误。 控制台的Cors错误: 我的(我调用getbyemail): 我从我的angular应用程序中调用get: 我还尝试添加: 并在我的中添加了配置文件: 但还是没有运气...

  • 问题是:我正在返回客户作为我的观点。根据我的观点,viewresolver应该映射到WEB-INF/Pages/Customer.html。相反,它正在通过dispatcher servlet,而无法找到客户HTML。它给出的错误是:“警告:在名为'mvc-dispatcher'的DispatcherServlet中找不到URI为[/springmvc/web-inf/pages/customer

  • 我已经为jwt身份验证设置了一个节点/Express服务器,可以与我的Create React应用程序一起使用。我用的是CORS npm包和简单中间件< code > app . use(CORS());来解决预期的CORS相关问题及其正常工作。 现在我想将 Elasticsearch 和 ReactiveSearch 添加到我的 React 应用程序中,并试图弄清楚如何克服本地 ES 实例的 C

  • 我试图按照headfirst jsp和servlets的书,我遇到了以下错误。HTTP状态404 - /Beer/form.html 我的文件夹组织如下 假猫- 同样在啤酒文件夹中,我还有另一个文件夹 WEB-INF,其中包含 web.xml 文件。 首先我想也许我的雄猫根本不起作用,所以我使用我以前完成的 servlet 对其进行了测试。成功了。 我重新启动了web服务器,但仍然出现此错误。我正

  • 这里有一个问题:我想保护URI,直到获得第三方OAuth2的授权。基于http://docs.spring.io/spring-security/oauth/apidocs/org/springframework/security/oauth2/config/annotation/web/configuration/EnableOAuth2Client.html,我有以下内容: 而且 最后 但这给