无法修复 CORS 错误(角度 + java spring)

Posted

技术标签:

【中文标题】无法修复 CORS 错误(角度 + java spring)【英文标题】:Can't fix CORS error (angular + java spring) 【发布时间】:2020-07-19 15:03:15 【问题描述】:

我正在尝试通过前端从后端请求数据,但出现错误:

Access to XMLHttpRequest at 'http://localhost:8081/api/transactions/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

我可以通过邮递员获取数据,但不是我的前端。我正在使用角靴和弹簧靴。 我的应用程序.java:

@EnableJpaRepositories
@EntityScan
@SpringBootApplication
public class KoalaTreeAccountingApplication 

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


我的安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                .anyRequest()
                .permitAll()
                .and().csrf().disable();
    

我的服务以角度进行 http 调用:

@Injectable(
    providedIn: 'root'
)
export class TransactionService 
    baseUrl = 'http://localhost:8081/api/';
    transactionUrl = this.baseUrl + 'transactions/';

    constructor(private http: HttpClient, private logger : Logger) 

    getAllTransactions() : Observable<Transaction[]> 
        this.logger.log("Request all transactions");
        return this.http.get<Transaction[]>(this.transactionUrl);
    

    getTransactionById(id : number) : Observable<Transaction> 
        this.logger.log("Request transaction " + id);
        return this.http.get<Transaction>(this.transactionUrl + id);
    

编辑:我试过了https://spring.io/guides/gs/rest-service-cors/Spring Security CORS filter not workingSecurity configuration with Spring-boothttps://***.com/a/31748398/12025088

Protip:在更改后重新运行应用程序之前进行全新安装。我是个白痴。

已通过使用此而不是 SecurityConfig.java 进行修复:

@Component
public class SimpleCORSFilter implements Filter 
    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-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "36000");
        response.setHeader("Access-Control-Allow-Headers", "origin, content-type, accept");
        chain.doFilter(req, res);
    

    public void init(FilterConfig filterConfig) 
    

    public void destroy() 
    

【问题讨论】:

你看过前 3 个链接了吗? google.com/search?q=how+to+fix+cors 你可以要求这个:***.com/a/59561352/8403689 @ArnaudClaudel 那些没有帮助。我试过spring.io/guides/gs/rest-service-cors,但它给了我错误Access to XMLHttpRequest at 'http://localhost:8081/api/transactions/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. @Imranmadbar 我已经用你发给我的线程中的配置替换了我的安全配置,但它给出了同样的错误。 请问可以提供资源控制器的代码吗?我说的是在 .../api/transactions url 上运行 GET 时调用的后端方法。 【参考方案1】:

您需要添加一个 bean 来配置 cors 并在您的安全配置中启用 cors

@Bean
public WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurer() 
        @Override
        public void addCorsMappings(final CorsRegistry registry) 
            registry.addMapping("/**")
                    .allowedOrigins("*")
                    .allowedMethods("*")
                    .allowedHeaders("*")
                    .allowCredentials(true).maxAge(3600);
        
    ;



@Override
protected void configure(HttpSecurity http) throws Exception 
    http.authorizeRequests()
            .anyRequest()
            .permitAll()
            .and().cors().and().csrf().disable();

【讨论】:

【参考方案2】:

您需要在您想要允许的 RestController 方法上配置 CORS。 CORS 是服务器响应。


    @CrossOrigin(origins = "http://localhost:4200")
    @GetMapping("/") 
    public List<Transaction> findAllTransactions()  
        return transactionService.findAllTransactions();  
     

【讨论】:

以上是关于无法修复 CORS 错误(角度 + java spring)的主要内容,如果未能解决你的问题,请参考以下文章

在我的 React 应用程序中获取 api 数据时如何修复 CORS 错误?

如何修复 react app 和 coinbase connect api 上的 cors 错误

CORS 错误,无法从 asp.net 核心后端接收数据

以角度添加拦截器后的CORS问题

为啥我在角度请求中收到此错误? (CORS)

以角度向谷歌表单提交数据时出现CORS问题