Angular SpringBoot未启用@CrosOrigin。角度2+;网页包客户端

Angular SpringBoot未启用@CrosOrigin。角度2+;网页包客户端,angular,spring-boot,webpack,Angular,Spring Boot,Webpack,我使用Sppring boot创建了一个REST上载服务: @CrossOrigin @RestController @RequestMapping("/upload") public class FileUploadHandler { @PostMapping("/doUpload") public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redi

我使用Sppring boot创建了一个REST上载服务:

@CrossOrigin
@RestController
@RequestMapping("/upload")
public class FileUploadHandler {

    @PostMapping("/doUpload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {

        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream = new BufferedOutputStream(
                        new FileOutputStream(new File(file.getName() + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "You successfully uploaded " + file.getName() + " into " + file.getName() + "-uploaded !";
            } catch (Exception e) {
                return "You failed to upload " + file.getName() + " => " + e.getMessage();
            }
        } else {

            redirectAttributes.addFlashAttribute("message",
                    "You successfully uploaded " + file.getOriginalFilename() + "!");

            return "Some error... ";
        }
    }

}
我正在使用Angular2+网页包客户端来使用该服务。问题是,当我尝试访问该服务时,会遇到CROS阻塞

XMLHttpRequest cannot load http://localhost:8080/kti-cms-spring/upload/doUpload. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://ac1068:8080' is therefore not allowed access.
我使用glassfish4作为应用服务器

我的配置:

@Configuration
@ComponentScan("de.awinta.kti.cms")
public class MainConfig {

    @Bean
    public FilterRegistrationBean corsFilter() {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        // likely you should limit this to specific origins
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setAllowCredentials(Boolean.TRUE);
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
        bean.setOrder(0);
        return bean;

    }
}
应用程序入口点

    @SpringBootApplication
public class KtiCmsApplication extends SpringBootServletInitializer {

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

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(applicationClass);
    }

    private static Class<KtiCmsApplication> applicationClass = KtiCmsApplication.class;
}
@springboot应用程序
公共类KtiCmsApplication扩展了SpringBootServletInitializer{
公共静态void main(字符串[]args){
run(KtiCmsApplication.class,args);
}
@凌驾
受保护的SpringApplicationBuilder配置(SpringApplicationBuilder应用程序){
返回application.sources(applicationClass);
}
私有静态类applicationClass=KtiCmsApplication.Class;
}

我不知道如何让它工作,并且正在考虑尝试使用普通的旧JAX-RS进行服务公开。也许这里有人对如何使用spring有想法。

我看不出您的代码中有什么特别的错误,但是下面的代码片段可能会帮助您运行。这就是我如何在一个springboot项目中以Ember.js作为前端设置cors的方法

尝试使用CorsFilter Bean将配置类CorsConfig添加到项目中:

package your.app.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

public CorsConfig() {
}

@Bean
public CorsFilter corsFilter() {

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // likely you should limit this to specific origins
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    config.setAllowCredentials(Boolean.TRUE);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
 }
}
@CrossOrigin
添加到控制器中(就像您已经拥有的那样)

这些医生和其他问题帮助我实现了这一目标:


我看不出您的代码中有什么特别的错误,但下面的代码片段可能会帮助您运行。这就是我如何在一个springboot项目中以Ember.js作为前端设置cors的方法

尝试使用CorsFilter Bean将配置类CorsConfig添加到项目中:

package your.app.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {

public CorsConfig() {
}

@Bean
public CorsFilter corsFilter() {

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // likely you should limit this to specific origins
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    config.setAllowCredentials(Boolean.TRUE);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
 }
}
@CrossOrigin
添加到控制器中(就像您已经拥有的那样)

这些医生和其他问题帮助我实现了这一目标:


嘿。谢谢你的反馈。在添加配置类之后,它仍然显示相同的错误。我确定,但是,您是否认为Glassfish可能无法正确加载应用程序?对不起,我对Glassfish了解不多,无法从您的示例中判断。为了确保这一点,您必须在Spring Boot中启用自动配置(通过EnableAutoConfiguration或@SpringBootApplication注释)。添加注释无助于:(.我在问题中添加了应用程序配置和入口点,可能会有所帮助。嘿,谢谢你的反馈。添加配置类后,它仍然会说相同的错误。我确定,但是,你认为Glassfish是否可能无法正确加载应用程序?对不起,我对Glassfish了解不多,也无法从Glassfish中分辨出来我们的示例。为了确保,您必须在Spring Boot中启用自动配置(通过EnableAutoConfiguration或@SpringBootApplication注释)。添加注释没有帮助:(.我将应用程序配置和入口点添加到了问题中,可能会有帮助。