【发布时间】:2019-11-11 11:11:44
【问题描述】:
我有一些关于Spring boot中Pre-flight Filter的代码,但我不知道这段代码的用途:
@Component
// We want to put this in front of SpringSessionFilter
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RequestFilter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
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", "x-requested-with, x-auth-token");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
if(!(request.getMethod().equalsIgnoreCase("OPTIONS"))) {
try {
chain.doFilter(req, res);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("Pre-fight");
response.setHeader("Access-Control-Allowed-Methods", "POST, GET, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "authorization, content-type, x-auth-token, " +
"access-control-request-headers,access-control-request-method,accept,origin,authorization,x-requested-with");
response.setStatus(HttpServletResponse.SC_OK);
}
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
这是这个文件的解释:
所以当 Angular 2 发送一个 http post ajax 调用时,它会首先发送一个 pre-flight 并且方法类型不是“POST”而是“OPTIONS”。如果这个预检有一个有效的响应,那么它将开始发送真正的 http post。这是为了防止跨站点攻击。在后端,spring 对此没有开箱即用的处理。所以我们需要检查http方法是否是预检。如果是,我们将只使用有效的标头和信息进行响应。如果没有,我们将继续过滤器链。
但是我看不懂源代码。谁能帮我解释一下?
【问题讨论】:
-
你在哪个部分有困难?
-
源代码完全符合您在上一段中提到的内容。它检查请求类型是否不是 OPTIONS,然后继续进行下一个过滤器。如果它是一个 OPTIONS 请求,这将是一个飞行前的 cors 请求,因此会做出相应的响应。仅当调用您的 API 的客户端来自不同的来源时,才需要这样做。否则不需要。阅读有关 CORS 的更多信息以更好地理解。
-
你能用代码解释一下吗?还是逐行解释代码?为什么我们需要
HttpServletRequest request = (HttpServletRequest) req;,response.setHeader("Access-Control-Allow-Origin", "*");是什么?FilterChain是什么?
标签: java spring spring-boot