Java后端设置服务器允许跨域

news/2024/7/5 3:04:13

文章目录

  • 1、实现
  • 2、一些问题
    • 关于各项请求头的作用
    • 关于预检请求
  • 3、一些补充
  • 4、疑问点

1、实现

以下通过servlet的Filter给所有响应的header加了一些跨域相关的数据,以实现允许跨域。

import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
public class GlobalCorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        //允许所有的域访问,可以设置只允许自己的域访问
        //服务器只需要告诉浏览器允许的域
        response.setHeader("Access-Control-Allow-Origin", "*");
        //response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com");
        //允许所有方式的请求(GET、POST),用于告知浏览器哪些方法是被允许的
        response.setHeader("Access-Control-Allow-Methods", "*");
        //指定了预检请求(OPTIONS请求)的有效期,单位为秒。在有效期内,浏览器可以直接发送实际请求,而无需再次发送预检请求。
        //(如果不设 Chromium 同时规定了一个默认值 5 秒),没有缓存将以OPTIONS进行预请求
        response.setHeader("Access-Control-Max-Age", "3600");
        //允许的头信息,告知浏览器哪些自定义请求头字段是被允许的
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
        //代表是预检请求
        if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            //直接让预检请求返回200,告诉浏览器可以发送实际请求了
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            //添加完头部信息后,直接放行
            chain.doFilter(req, res);
        }
    }
}

2、一些问题

关于各项请求头的作用

在这里插入图片描述

关于预检请求

在这里插入图片描述

简言之就是发送OPTION请求到服务器,服务器根据预检请求的请求头信息,自行判断是否允许跨域,并把判断结果放到响应的header中返回给浏览器。预检请求的请求头中包含了一些关键信息,例如请求方法、请求头字段、请求的URL等。以下是一个预检请求的示例:

请求方法:OPTIONS
URL:https://www.example.com/api/data

请求头字段:
Origin: https://www.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type

这个示例中,浏览器向 https://www.example.com 发送了一个OPTIONS请求,用于检查是否允许发送POST请求,并且是否允许包含Content-Type请求头字段。预检请求的服务器是当前URL的服务器,而不是跳转页面URL的服务器。预检请求是在发送实际请求之前进行的,用于检查服务器是否允许跨域请求。因此,预检请求会发送到当前URL的服务器,以获取服务器的许可。

在这里插入图片描述

3、一些补充

关于跨域的前端实现或者nginx实现,跳这篇:【跨域】 。文章部分概念贴图:

在这里插入图片描述

[截图来源:上面链接]

4、疑问点

我理解的是判断下是否为OPTION请求方式,是则加允许跨域的头部,不懂为啥旧项目给所有的请求都加:

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/2121202.html

相关文章

createDocumentFragment()用法总结

createDocumentFragment()用法总结 1.描述 DocumentFragments 是DOM节点。它们不是主DOM树的一部分。通常的用例是创建文档片段,将元素附加到文档片段,然后将文档片段附加到DOM树。在DOM树中,文档片段被其所有的子元素所代替。 因为文档片段存在于内存中,并不在DOM树中,…

RockyLinux8 RockyLinux9安装postgresql16-devel开发包

1、PG的插件扩展有些需要自行编译,需要安装PG开发包 2、RockyLinux8安装 #创建用户先 useradd postgressudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disab…

十四届蓝桥杯 冶炼金属(二分 / 公式)

0322重写代码&#xff1a; #include<algorithm> #include<iostream> using namespace std;int maxx1000000010,minn-1;int main() {int n;scanf("%d",&n);for(int i0;i<n;i){int a,b;scanf("%d%d",&a,&b);maxx min(maxx,a/b)…

高中数学:复合函数基本考点整理

一、复合函数定义 类似f(g(x))或者f(f(x))这种形式的函数&#xff0c;就是复合函数 二、考点 1、复合函数的定义域 解题思路&#xff1a; 1、外函数的定义域是内函数的值域 2、确定内函数的定义域 例题 f(x)的定义域是(0,1)&#xff0c;求f(lnx)的定义域 2、复合函数的奇偶…

Linux文本编辑器vi的使用

一、文本的创建与查看 功能项命令实例作用文件创建vi /opt/learn/hello.txt在目录/opt/learn下创建文件hello.txt并进入vi编辑界面touch /opt/learn/test在目录/opt/learn下创建空白文件testcat > /opt/learn/catfile << EOF创建文件catfile并在屏幕上输入内容&#…

学会在 C++ 中使用变量:从定义到实践

C 变量 变量是用于存储数据值的容器。 在 C 中&#xff0c;有不同类型的变量&#xff08;使用不同的关键字定义&#xff09;&#xff0c;例如&#xff1a; int - 存储整数&#xff08;没有小数点&#xff09;&#xff0c;例如 123 或 -123double - 存储浮点数&#xff0c;带…

docker基础(五)之docker run(第二弹)

文章目录 概述docker run语法命令选项用法速查OPTIONS说明&#xff1a;-h "mars"-e username"ritchie"--env-file[]拓展&#xff1a;为什么 env.list &#xff0c;拓展名是.list那命名为env.txt 是否能使用--env-file识别呢 --cpuset"0-2" or --…

24计算机考研调剂 | 广州医科大学

广州医科大学何玉成老师招收机器人、生物医学工程、机械自动化相关专业学硕调剂生 考研调剂相关信息 一、单位简介 广州医科大学是一所以医学为优势和特色的国家“双一流”建设高校。生物医学工程学院于2022年4月成立&#xff0c;由中国科学院院士徐涛教授担任院长。学…