我的Web应用程序上有一个小问题:一个与spring boot API连接的angular2应用程序。
我无法从angular2应用访问我的请求。我收到此错误:
Failed to load http://localhost:8080/deliveryMan/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.
Java代码:
@RestController @RequestMapping(value = "/deliveryMan") @CrossOrigin public class DeliveryManController { @Autowired DeliveryManService deliveryManService; @RequestMapping(value = "/getAllDeliveryMan", method = RequestMethod.GET) public Iterable<DeliveryMan> getAllDeliveryMan(){ return deliveryManService.findAll(); } @RequestMapping(method = RequestMethod.PUT, consumes = "application/json") public DeliveryMan addDeliveryMan(@RequestBody DeliveryMan deliveryMan) throws InvalidObjectException { deliveryManService.save(deliveryMan); return deliveryMan; } @SpringBootApplication @EnableAutoConfiguration @ComponentScan public class MyApp{ public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }
angular2代码:
private apiUrl = 'http://localhost:8080/deliveryMan/'; getAll(): Promise<DeliveryMan[]> { const url = this.apiUrl + 'getAllDeliveryMan'; return this.http.get(url) .toPromise() .then(response => response.json().data as DeliveryMan[]) .catch(this.handleError); } saveDeliveryMan(deliveryMan: DeliveryMan): Promise<DeliveryMan> { const url = this.apiUrl; return this.http.put(url, JSON.stringify(deliveryMan), this.headers) .toPromise() .then(() => deliveryMan) .catch(this.handleError); }
为了解决该问题,我在控制器类中添加了@CrossOrigin。它解决了getAll方法的问题,但没有解决其他方法的问题。
如何解决它,以便我可以使用PUT方法而不会出现此错误?
CORSFilter.java在你的项目中创建文件。
CORSFilter.java
@Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CORSFilter implements Filter { /** * CORS filter for http-request and response */ public CORSFilter() { } /** * Do Filter on every http-request. */ @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "access_token, authorization, content-type"); if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } /** * Destroy method */ @Override public void destroy() { }