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

 更新时间:2026年06月30日 09:09:51   作者:-代号9527  
通过Servlet的Filter实现跨域响应头的动态添加,解析预检请求(OPTIONS)的关键信息以判断跨域请求的合法性,并讨论前端与Nginx的跨域实现方案

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请求方式,是则加允许跨域的头部,不懂为啥旧项目给所有的请求都加:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java的代理模式你真的了解吗

    Java的代理模式你真的了解吗

    这篇文章主要为大家详细介绍了Java的代理模式,结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题,包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式
    2022-03-03
  • Java反转链表测试过程介绍

    Java反转链表测试过程介绍

    这篇文章主要介绍了Java反转链表测试过程,学习过数据结构的小伙伴们,对链表想来是并不陌生。本篇文章将为大家介绍几种在Java语言当中,实现链表反转的几种方法,以下是具体内容
    2023-04-04
  • JavaWeb Servlet生命周期细枝末节处深究

    JavaWeb Servlet生命周期细枝末节处深究

    Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,下面这篇文章主要给大家介绍了关于JavaWeb.servlet生命周期的相关资料,需要的朋友可以参考下
    2022-10-10
  • Java常用数字工具类 数字转汉字(1)

    Java常用数字工具类 数字转汉字(1)

    这篇文章主要为大家详细介绍了Java常用数字工具类,数字转汉字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java高性能缓存框架之Caffeine详解

    Java高性能缓存框架之Caffeine详解

    这篇文章主要介绍了Java高性能缓存框架之Caffeine详解,Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美,Caffeine受启发于Guava Cache的API,使用API和Guava是一致的,需要的朋友可以参考下
    2023-12-12
  • java中aop实现接口访问频率限制

    java中aop实现接口访问频率限制

    本文主要介绍了java中aop实现接口访问频率限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • JAVA多线程之方法 JOIN详解及实例代码

    JAVA多线程之方法 JOIN详解及实例代码

    这篇文章主要介绍了JAVA多线程之方法 JOIN详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • 深入浅析java中finally的用法

    深入浅析java中finally的用法

    finally自己由关键字finally和后面的finally块组成。这篇文章重点给大家介绍java中finally的用法,需要的朋友参考下吧
    2018-06-06
  • Spring IOC简单理解及创建对象的方式

    Spring IOC简单理解及创建对象的方式

    这篇文章主要介绍了Spring IOC简单理解及创建对象的方式,本文通过两种方式给大家介绍创建对象的方法,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • 非常适合新手学生的Java线程池优化升级版

    非常适合新手学生的Java线程池优化升级版

    作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门
    2022-03-03

最新评论