我在Spring Boot中有一个Web服务器。我可以向它发送HTTP请求,并从Send HTTP等工具获得答案。我还有一个基于Angular2的网站whoich也可以工作。部分功能必须包括从Chrome中运行的Angular2到Spring Boot服务器的HTTP请求。每次我这样做时,Chrome控制台中都会出现错误:
XMLHttpRequest 无法加载"URL Server"。请求的资源上不存在"访问控制允许源"标头。因此,不允许访问源"URL 客户端"。
我把 Spring 服务器@CrossOrigin放在所有有意义的地方:在@Controller之前、@RequestMapping、@GetMapping,但它没有帮助。我缺少什么以及如何克服?非常感谢,有点绝望,Levi
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
试试这个它对我有用!
您需要为应用程序添加 CQRSFilter,并在 Spring 引导配置类中设置该 CORSFilter。
你要做的是
1> 创建自己的实现筛选器的 CQRSFilter
2>您应该在过滤器中添加如下代码
@Component
public class CORSFilter implements Filter{
static Logger logger = LoggerFactory.getLogger(CORSFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
chain.doFilter(request, response);
}
public void destroy() {}
}
3> 将过滤器放在 spring 配置文件中
@EnableWebMvcSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class)
}
}
尝试如下:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("<<MAPPING>>").allowedOrigins("<<ORIGINS>>");
}
};
}
请浏览以下教程,如果仍然不起作用,请尝试使用替代选项:
https://spring.io/guides/gs/rest-service-cors/
更新 1:
由@Levi更新
import org.springframework.web.cors.CorsConfiguration; //+ more public class RestConfiguration {
@Bean public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source); }
}
您需要设置后端的代理,如此处所述。
1)创建包含内容的文件proxy.conf.json(在package.json旁边)
{
"/api": {
"target": "http://localhost:8080",
"secure": false
}
}
2) 在 package.json 中编辑启动脚本
"start": "ng serve --proxy-config proxy.conf.json"
3) 运行
npm start