java - 请解释 Spring Boot 中的 Pre-flight Filter 代码
问题描述
我在 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方法是否是预检。如果是,我们将只使用有效的标头和信息进行响应。如果没有,我们将继续过滤器链。
但我无法理解源代码。任何人都可以为我解释吗?
解决方案
为什么 response.setHeader("Access-Control-Allow-Origin", "*"); ?
跨域资源共享 (CORS) 是一种安全概念,允许限制在 Web 浏览器中实现的资源。它可以防止 JavaScript 代码生成或使用针对不同来源的请求。
例如,您的 Web 应用程序在 8080 端口上运行,并且通过使用 JavaScript,您正尝试从 9090 端口使用 RESTful Web 服务。在这种情况下,您将面临 Web 浏览器上的跨域资源共享安全问题。要授予访问权限,您可以将其设置为 * 或使用您的域
CORS 预检请求是检查是否理解 CORS 协议的 CORS 请求。
这是一个 OPTIONS 请求,使用三个 HTTP 请求标头:Access-Control-Request-Method, Access-Control-Request-Headers, and the Origin header
.
浏览器在需要时发出请求preflight
。automatically
在正常情况下,前端开发人员不需要自己制作此类请求。
例如,在发送 DELETE 请求之前,客户端可能会通过使用预检请求询问服务器是否允许DELETE
请求:
OPTIONS /resource/foo
Access-Control-Request-Method: DELETE
Access-Control-Request-Headers: origin, x-requested-with
Origin: https://foo.bar.org
如果服务器允许,那么它将使用 Access-Control-Allow-Methods 响应标头响应预检请求,其中列出了 DELETE:
HTTP/1.1 204 No Content
Connection: keep-alive
Access-Control-Allow-Origin: https://foo.bar.org
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE
Access-Control-Max-Age: 86400
什么是过滤链?
推荐阅读
- javascript - 模式未打开时隐藏“关闭”链接
- c# - 如何将文件系统添加到我的 HTTP 侦听器/在 C# 中添加框架
- node.js - 当 deno 来的时候会发生什么
- python - Flask SQLAlchemy 自引用排序列表
- ffmpeg - 使用 ffmpeg 和 vaapi 对 HEVC 4K HDR 进行转码
- c# - 使用 Ninject 绑定 PetaPoco
- python - 将张量提供给模型
- jquery - 这会对我网站的加载时间产生负面影响吗?
- excel - 基于其他列值删除列值的 VBA 脚本
- sql - 错误代码:-802,SQL 状态:22023 SQL0802