我正在尝试从我的角度2前端应用程序调用GET请求到弹簧启动休息微服务,但是当我调用时,只有我收到错误,例如“No Access-Control-Allow-Origin标头存在于请求的资源“。
这是我的控制器动作,
@RequestMapping(value = "/checkUsers", method = RequestMethod.POST)
public String checkLogin(@RequestBody Users user) throws Exception{
ObjectMapper mapper = new ObjectMapper();
List<Users> useObj = (List<Users>) userRepo.findAll();
return(mapper.writeValueAsString(useObj));
}
当我运行我的角度时,我收到上述错误。我添加了它的截图
所以我很困惑,这是来自角度问题或弹簧启动微服务响应问题。任何人都可以帮助找到它的解决方案吗?
答案 0 :(得分:2)
由于它们在不同的端口上运行,因此您必须在服务器端允许跨源资源共享(CORS)。 在spring boot中,您可以通过将@CrossOrigin注释添加到处理程序方法来实现:
@CrossOrigin(origins = "http://localhost:4200")
也可以在控制器类级别添加此注释,以便在该类的所有处理程序方法上启用CORS。
答案 1 :(得分:0)
接受的答案是好的,因为它提供了一个可行的解决方案,但它也迫使您在每个控制器中对服务器端的客户端URL进行硬编码。您可以改为设置全局CORS配置。如果您的Web配置扩展了WebMvcConfigurereAdapter
类,则可以简单地覆盖addCorsMappings
方法。以下示例为整个应用程序启用CORS:
@Configuration
public class WebConfig extends WebMvcConfigurereAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}
在Spring here
中阅读有关CORS支持的更多信息答案 2 :(得分:0)
在你的Application.java中添加一个bean
@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
return bean;
}
它是全局的,它适用于您项目的每个控制器。
答案 3 :(得分:0)
创建一个实现javax.servlet.Filter接口的Spring Boot Component类并添加所需的标头解决了我的类似问题。
@Component
public class YourAppCorsFilter implements Filter{
@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", request.getHeader("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);
}
}
让我知道将其添加到微服务后是否仍然遇到问题。