"cors header ‘access-control-allow-origin’ missing" denies request, even though origin is allowed. "cors header 'access-control-allow-origin'缺失"拒绝请求,尽管来源是被允许的。

12 浏览
0 Comments

"cors header ‘access-control-allow-origin’ missing" denies request, even though origin is allowed. "cors header 'access-control-allow-origin'缺失"拒绝请求,尽管来源是被允许的。

我想从我的Angular应用程序向我的Spring Boot服务器发送POST请求。请求被拒绝,显示“缺少cors头'access-control-allow-origin'”的消息。

我已经启用了我的Angular应用程序的来源“http://localhost:4200”,就像我为其他RestController做的那样(这些都可以正常运行)。据我所知,唯一的区别是我在我的不起作用的控制器中处理POST请求。

控制器:

@RestController
@CrossOrigin(origins = "http://localhost:4200")
public class Controller {
    @Autowired
    private ReqRepository reqRepository;
    @PostMapping("/reqs")
    public Req saveReq (@Valid @RequestBody Req req) {
        return reqRepository.save(req);
    }
}

仓库:

@Repository
public interface ReqRepository extends JpaRepository {
}

Angular服务:

@Injectable()
export class ReqService {
  private httpOptions = {
    headers: new HttpHeaders({
      'Access-Control-Allow-Origin': '*',
      'Content-Type': 'application/json'
    })
};
  constructor(private http: HttpClient) {}
  sendReq(req: Req): Observable {
    return this.http.post('http://localhost:8080/reqs', req, this.httpOptions);
  }
}

我以为允许请求来源就足够了,这样请求就可以正常进行,但实际上却被阻止了。看起来我忽略了某些东西来启用POST请求。

更新:

我进一步测试了该控制器,它可以处理GET请求。

我只是更改了方法,所以问题似乎出现在POST请求中。

以下是使用GET测试端点的控制器,而不是POST端点:

@RestController
@CrossOrigin(origins = "http://localhost:4200")
public class Controller {
    @Autowired
    private ReqRepository reqRepository;
    @GetMapping("/reqs")
    public Page testCall (Pageable pageable) {
        System.out.println("Geeting request");
        return reqRepository.findAll(pageable);
    }
}

0
0 Comments

问题是我的Spring Security配置。

我不得不禁用csrf,因为它默认是启用的。

我从这篇帖子中找到了解决方案:How to Solve 403 Error in Spring Boot Post Request

我的解决方案如下:

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    //Override basic security settings so no login page is needed to access the RestEndpoints
    protected void configure(HttpSecurity security) throws Exception
    {
        security.httpBasic().disable();
        security.csrf().disable();
    }
}

0
0 Comments

问题出现的原因是服务器没有发送"Access-Control-Allow-Origin"头部,即使允许了该来源。解决方法是在服务器端发送该头部,并且将请求方法改为包括POST的方法。

文章内容如下:

解决CORS头部"access-control-allow-origin"缺失的问题

很高兴您的请求现在可以工作了。请注意,"Access-Control-Allow-Origin"是服务器发送的一个头部。在这里,您试图从angular发送该头部到服务器,但是这是行不通的。

另外,请将(origins = "http://localhost:4200")改为(origins = "http://localhost:4200", methods="GET,POST,PUT,DELETE,ORIGIN"),然后看看是否可以工作。

嘿,遗憾的是请求还是不工作。目前只有GET请求可以工作,但是我需要一个POST请求。但是每次我发送POST请求时都会出现CORS错误。

我已经更新了答案,请尝试一下并告诉我。

我指定了POST作为允许的请求方法,但是仍然得到相同的错误。(origins = "http://localhost:4200", methods= RequestMethod.POST)。据我了解,如果我不指定请求方法,那么默认情况下会允许所有方法。有趣的是,如果我使用一个全局配置,如上面链接的配置,我不会得到CORS错误,而是得到403访问被拒绝的错误。

0