【问题标题】:Please explain Pre-flight Filter code in Spring Boot请解释 Spring Boot 中的 Pre-flight Filter 代码
【发布时间】: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


【解决方案1】:

为什么 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

什么是过滤链?

FilterChainFilters

【讨论】:

    猜你喜欢
    • 2020-06-22
    • 2016-12-24
    • 2015-07-13
    • 1970-01-01
    • 2021-07-15
    • 2022-11-19
    • 2016-02-29
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多