后端服务框架 SpringBoot
如果请求 method 的是 option 会导致 HttpServletRequest 读取不到请求内容。
axios 的 option 请求目的是确认后端服务是否允许跨站请求,因此后端这边特殊处理一下
option 请求即可
在 filter 中如果遇到 option 请求直接返回
public class SecretFilter extends OncePerRequestFilter {
String defaultRsp = "{}";
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
boolean secret = String.valueOf(1).equals(request.getHeader("fu-secret"));
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.getOutputStream().write(defaultRsp.getBytes(StandardCharsets.UTF_8));
response.setStatus(HttpStatus.OK.value());
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
response.setHeader("Access-Control-Allow-Headers", "*");
return;
}
String body = IoUtil.readString(request.getInputStream());
try {
filterChain.doFilter(new FuminoRequestWrapper(request, body), response);
} finally {
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,PUT,DELETE");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,Content-Type");
}
}