我正在尝试将Angle 6项目与Spring Boot应用程序连接。尽管我已经安装了所有依赖项和导入,但是当我运行角度项目时,它始终会出现此错误。
我在控制器类中使用了以下代码。
@CrossOrigin(origins =“ http://localhost:4200/”,maxAge = 3600)
我还将这个SimpleCORSFilter.java文件包含在java文件夹中:
package com.oms;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SimpleCORSFilter implements Filter {
private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);
public SimpleCORSFilter() {
log.info("SimpleCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");
chain.doFilter(req, res);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
我也已在angular项目中创建了proxy.conf.json文件:
{
"/api": {
"target": "http://localhost:8080",
"secure": false
}
}
此文件包含在angular.json中:
“开始”:“ ng serve --proxy-config proxy.conf.json”,
仍然出现此错误:
在以下位置访问XMLHttpRequest 原产地的“ http://localhost:8080/fetchAll” “ http://localhost:4200”已被CORS政策阻止:请求 标头字段授权不被 飞行前响应中的Access-Control-Allow-Header。**
我引用了这类查询,但无法获得确切的解决方案。
我真的很困惑,如果代码中有任何错误?应该采取什么步骤解决此问题?
答案 0 :(得分:1)
此错误即将到来,因为请求包含一些其他标头,而这些标头在您的CORS过滤器配置中未提及。
为了在开发过程中添加CORS支持,我通常更喜欢在spring配置文件下面添加。您还需要在应用程序配置文件(application.properties)中使用值为app.cors.enabled
的{{1}}键,才能使其正常工作。
true
请确保在生产环境中,从配置文件中删除import org.springframework.context.annotation.Bean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@ConditionalOnProperty(name = "app.cors.enabled")
/**
* If the value of the key "app.cors.enabled" is true in application.properties file,
* then only this configuration will be enabled.
*
*/
public class SpringConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/*").allowedHeaders("*").allowedOrigins("*").allowedMethods("*")
.allowCredentials(true);
}
};
}
}
键,或将其值设置为app.cors.enabled
。如果在生产环境中也需要CORS支持,请确保使用固定值,而不是使用false
一旦这样做,就无需在控制器上使用*
注释。
答案 1 :(得分:1)
在使用Spring Boot时,建议您在配置中添加 CorsFilter bean,而不要引入CORS过滤器。让我知道是否有帮助。
@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);
}
快乐编码:)
答案 2 :(得分:1)
问题与带有弹簧罩的过滤器的订购有关。将此注释添加到您的CORSFilter
:@Order(Ordered.HIGHEST_PRECEDENCE)
上。
这将确保您的CORSFilter
具有最高的执行力(最先)。
答案 3 :(得分:0)
请添加一个Servlet过滤器并添加以下代码。 它应该工作。 必须添加“访问控制允许标题”,“ *” 。 不需要创建 proxy.conf.json 。
@Component
@Order(1) 公共类MyProjectFilter实现了Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PATCH,DELETE,PUT,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Max-Age", "86400");
chain.doFilter(req, res);
}
}