为了账号安全,请及时绑定邮箱和手机立即绑定

请解释一下 Spring Boot 中的 Pre-flight Filter 代码

请解释一下 Spring Boot 中的 Pre-flight Filter 代码

当年话下 2023-02-23 18:19:35
我在 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 调用时,它会首先发送一个飞行前的方法类型不是“POST”而是“OPTIONS”。如果这个预检有一个有效的响应,那么它将开始发送真正的 http post。这是为了防止跨站攻击。在后端,spring 对此没有开箱即用的处理。所以我们需要检查 http 方法是否是预检。如果是,我们将只用有效的标头和信息进行响应。如果没有,我们将继续过滤器链。但是看不懂源码。任何人都可以为我解释吗?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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

查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信