Nic*_*ack 9 spring spring-boot angular
我正在使用 Spring 运行服务,而我的 Angular 前端在尝试发出 POST 请求时收到了带有 Request Method: OPTIONS 的 403。
Spring 服务和 Angular 应用程序都在我的机器上本地运行。我尝试使用 Chrome 插件切换 CORS,但这似乎并没有解决问题。
我对服务的所有 GET 请求似乎都正常工作。我可以在 Postman 中执行 POST 请求,所以我不确定为什么 angular 应用程序不能发出请求,但 Postman 可以。
****编辑****
响应头
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH
Content-Length: 20
Date: Sat, 31 Mar 2018 19:15:01 GMT
Run Code Online (Sandbox Code Playgroud)
请求头
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:9901
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36
Run Code Online (Sandbox Code Playgroud)
CORS 请求由您的前端发出,以查看HTTP Verbs您的支持允许的方法 ( )。这通常是货币操作所必需的,例如,POST或PUT旨在修改数据的操作。
因此,您的前端将首先进行此调用,您的后端需要使用允许的方法进行响应,您还可以限制特定的 URI,然后在成功验证后进行目标调用。
这是完全正常的,angular 在内部执行此操作,以便在不知道服务器是否允许的情况下不会发出不必要的数据请求。
以下是您将如何在Spring.
//Change/Customize as necessary
@Bean
CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("<your origin>");
corsConfiguration.setAllowedMethods(Arrays.asList(
HttpMethod.GET.name(),
HttpMethod.HEAD.name(),
HttpMethod.POST.name(),
HttpMethod.PUT.name(),
HttpMethod.DELETE.name()));
corsConfiguration.setMaxAge(1800L);
source.registerCorsConfiguration("/**", corsConfiguration); // you restrict your path here
return source;
}
Run Code Online (Sandbox Code Playgroud)
如果您还在response headers后端使用任何自定义,那么您也需要在 CORS 配置中允许它。举个例子
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addExposedHeader("header1");
corsConfiguration.addExposedHeader("header2");
Run Code Online (Sandbox Code Playgroud)
要修复 Angular(前端)和 Spring boot(后端)项目中的所有 CORS 问题,请添加以下 Spring 组件:
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.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ConfigCtrl implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
final HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
response.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig config) throws ServletException {
}
}
Run Code Online (Sandbox Code Playgroud)
PS 初学者:类的名称及其在 Spring 应用程序中的位置无关紧要。
归功于 Ajitesh Kumar。
如果我们谈论的是 SpringBoot,大概是最新的或至少是最近的版本,那么我们可以简单地使用控制器类中注释@CrossOrigin旁边的注释。@RestController从 Spring 版本开始可用。4.2
例如:
@RestController
@CrossOrigin
@RequestMapping("/api")
public class MyObjectsController {
private final MyObjectsService service;
@Autowired
public MyObjectsController(MyObjectsService service) {
this.service = service;
}
@GetMapping("/version")
public Version getVersion() {
return service.getVersion();
}
@PostMapping("/objects")
public ObjectResource createObject(@RequestBody @Valid ObjectData data) {
return service.createObject(data);
}
@GetMapping("/objects/{id}")
public ObjectResource getObject(@PathVariable String id) {
return service.getObjectById(id);
}
}
Run Code Online (Sandbox Code Playgroud)
好处:
Referer分析标头的存在)也可以看看:
| 归档时间: |
|
| 查看次数: |
14475 次 |
| 最近记录: |