HTTP 头部 Access-Control-Max-Age 用法

举报
林欣 发表于 2025/03/19 11:40:43 2025/03/19
【摘要】 代码示例这是一个 spring boot 常用的 CorsFilter 示例代码import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletResponse;import java.io.IOException; @Componentpu...

代码示例

这是一个 spring boot 常用的 CorsFilter 示例代码

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
@Component
public class CorsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
    @Override
    public void doFilter(
                        ServletRequest req,  //接收到的请求
                        ServletResponse res, //要发送的响应
                        FilterChain chain)   //将请求传递到下一个过滤器或目标资源(如servlet)
                        throws IOException, ServletException {
        //System.out.println("*********************************过滤器被使用**************************");
        HttpServletResponse response = (HttpServletResponse) res;
        //设置跨域资源共享(CORS)的允许来源为任意域(*)。这意味着任何域都可以访问这个资源。
        response.setHeader("Access-Control-Allow-Origin", "*");
        //允许前端请求携带凭证(如Cookies和HTTP认证信息)
        response.setHeader("Access-Control-Allow-Credentials", "true");
        //设置允许的HTTP请求方法,包括POST、GET、OPTIONS和DELETE
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        //设置预检请求的结果(即OPTIONS请求)能够被缓存多久(以秒为单位)。这里设置为3600秒(1小时)
        response.setHeader("Access-Control-Max-Age", "3600");
        //设置允许的HTTP请求头,这里允许x-requested-with和content-type
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
        //调用FilterChain对象的doFilter方法,将请求和响应传递到下一个过滤器或目标资源(如servlet)
        chain.doFilter(req, res);
    }
    @Override
    public void destroy() {
    }
}

Access-Control-Max-Age 定义

Access-Control-Max-Age 是一个HTTP响应头,它用于指定预检请求(即OPTIONS请求)的结果可以被缓存的时间长度(以秒为单位)。预检请求是浏览器在发送跨域请求之前自动发送的一种请求,用于检查服务器是否允许跨域请求。

缓存的内容

  • 预检请求的结果:这包括服务器对OPTIONS请求的响应,其中包含了跨域请求是否被允许的信息(如允许的HTTP方法、请求头等)。

缓存的请求类型

  • OPTIONS请求:这是唯一被Access-Control-Max-Age缓存的请求类型。其他类型的请求(如GET、POST)本身不会被这个头缓存,但它们可以受益于预检请求结果的缓存。

示例解释

在提供的CorsFilter.java文件中,Access-Control-Max-Age被设置为3600秒(1小时)。这意味着浏览器在1小时内不会再次对相同的跨域请求发起预检请求(OPTIONS请求),而是直接使用缓存的预检请求结果。

总结

  1. Access-Control-Max-Age缓存的是预检请求(OPTIONS请求)的结果

  2. Access-Control-Max-Age通过缓存预检请求的结果来优化跨域请求的性能,并不会直接缓存GET或POST请求,但它可以减少GET和POST请求发起前需要进行的预检请求次数,从而提高跨域请求的效率。

 

 

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。