Java 请解释Spring Boot中的飞行前过滤器代码

Java 请解释Spring Boot中的飞行前过滤器代码,java,spring,spring-boot,Java,Spring,Spring Boot,我有一些关于Spring boot中飞行前过滤器的代码,但我不知道这些代码的用途: @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

我有一些关于Spring boot中飞行前过滤器的代码,但我不知道这些代码的用途:

@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发送一个HTTPPOST ajax调用时,它将首先发送一个pre-flight,方法类型不是“post”,而是“OPTIONS”。如果此预飞行具有有效响应,则它将开始发送真正的http post。这是为了防止跨站点攻击。在后端,spring对此没有现成的处理。因此,我们需要检查http方法是否为预飞行。如果是,我们只会用有效的标题和信息进行响应。如果没有,我们将继续过滤链

但是我不能理解源代码。有人能为我解释一下吗

为什么选择response.setHeader(“访问控制允许源代码”、“*”)

跨源资源共享(CORS)是一种安全概念,允许限制在web浏览器中实现的资源。它防止JavaScript代码生成或使用针对不同来源的请求

例如,您的web应用程序运行在8080端口上,通过使用JavaScript,您试图从9090端口使用RESTful web服务。在这种情况下,您将面临web浏览器上的跨源资源共享安全问题。要授予访问权限,您可以将其设置为*或您的域

CORS飞行前请求是检查CORS协议是否被理解的CORS请求

它是一个选项请求,使用三个HTTP请求头:
访问控制请求方法、访问控制请求头和原始头

飞行前
请求由浏览器在需要时自动发出。在正常情况下,前端开发人员不需要自己编写这样的请求

例如,客户机可能会在发送删除请求之前,通过使用飞行前请求询问服务器是否允许
删除
请求:

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 response标头响应飞行前请求,该标头列出删除:

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
什么是过滤链


您对哪一部分有困难?源代码完全符合您在上述段落中提到的内容。它检查请求类型是否不是选项,然后继续下一个筛选器。如果是选项请求,则为飞行前cors请求,并据此作出响应。只有当调用API的客户端来自不同的来源时,才需要这样做。否则不需要。阅读更多关于CORS的内容,以便更好地理解。你能用代码解释一下吗?还是逐行解释代码?为什么我们需要
HttpServletRequest=(HttpServletRequest)req
,什么是
response.setHeader(“访问控制允许原点“,“*”)?什么是过滤链?