Angular SpringBoot未启用@CrosOrigin。角度2+;网页包客户端
我使用Sppring boot创建了一个REST上载服务: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
@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
添加到控制器中(就像您已经拥有的那样)
这些医生和其他问题帮助我实现了这一目标:
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
添加到控制器中(就像您已经拥有的那样)
这些医生和其他问题帮助我实现了这一目标: