Java实现CORS跨域请求的实现方法

发布时间 - 2026-01-11 03:22:58    点击率:

问题

使用前后端分离模式开发项目时,往往会遇到这样一个问题 -- 无法跨域获取服务端数据

这是由于浏览器的同源策略导致的,目的是为了安全。在前后端分离开发模式备受青睐的今天,前端和后台项目往往会在不同的环境下进行开发,这时就会出现跨域请求数据的需求,目前的解决方案主要有以下几种:

JSONP、iframe、代理模式、CORS等等
前面几种方式在这里不讲,网上有很多资料。在这里我主要分享一下CORS这种解决方式,CORS即“跨域资源共享”,它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

使用 CORS 跨域的时候和普通的 ajax 过程是一样的,只是浏览器在发现这是一个跨域请求的时候会自动帮我们处理一些事情,所以说只要服务端提供支持,前端是不需要做额外的事情的。

实现

实现的大概思路是这样的,首先使用过滤器获取请求对象request的信息,比如Origin 字段(表示请求来自哪个源,包括协议、域名、端口),通过预先配置的参数判断请求是否合法,然后设置响应对象response的头信息,实现跨域资源请求。在介绍实现方式之前我们先来了解一下会用到的响应头信息。

响应头

Access-Control-Allow-Methods
用来列出浏览器的CORS请求允许使用的HTTP方法,如:GET、POST、PUT、DELETE、OPTIONS

Access-Control-Allow-Credentials
表示是否支持跨域Cookie

Access-Control-Allow-Headers
逗号分隔的字符串,表示服务器支持的所有头信息字段,如Content-Type以及自定义的字段

Access-Control-Expose-Headers
与“Access-Control-Allow-Headers”相反,表示不支持的头信息字段

Access-Control-Allow-Origin
允许跨域的请求源信息,包括协议、域名、端口,为*表示允许所有请求来源,并且只能设置一个请求源

下面介绍一下Java后台如何实现这种方式。

代码

由于最近在使用spring-boot,所以接下来以spring-boot为基础来实现。

首先创建一个CorsFilter过滤器,代码如下:

...
@WebFilter(filterName = "corsFilter", urlPatterns = "/*",
    initParams = {@WebInitParam(name = "allowOrigin", value = "*"),
        @WebInitParam(name = "allowMethods", value = "GET,POST,PUT,DELETE,OPTIONS"),
        @WebInitParam(name = "allowCredentials", value = "true"),
        @WebInitParam(name = "allowHeaders", value = "Content-Type,X-Token")})
public class CorsFilter implements Filter {

  private String allowOrigin;
  private String allowMethods;
  private String allowCredentials;
  private String allowHeaders;
  private String exposeHeaders;

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
    allowOrigin = filterConfig.getInitParameter("allowOrigin");
    allowMethods = filterConfig.getInitParameter("allowMethods");
    allowCredentials = filterConfig.getInitParameter("allowCredentials");
    allowHeaders = filterConfig.getInitParameter("allowHeaders");
    exposeHeaders = filterConfig.getInitParameter("exposeHeaders");
  }

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    if (!StringUtils.isEmpty(allowOrigin)) {
      if(allowOrigin.equals("*")){
        response.setHeader("Access-Control-Allow-Origin", allowOrigin);
      }else{
        List<String> allowOriginList = Arrays.asList(allowOrigin.split(","));
        if (allowOriginList != null && allowOriginList.size() > 0) {
          String currentOrigin = request.getHeader("Origin");
          if (allowOriginList.contains(currentOrigin)) {
            response.setHeader("Access-Control-Allow-Origin", currentOrigin);
          }
        }
      }
    }
    if (!StringUtils.isEmpty(allowMethods)) {
      response.setHeader("Access-Control-Allow-Methods", allowMethods);
    }
    if (!StringUtils.isEmpty(allowCredentials)) {
      response.setHeader("Access-Control-Allow-Credentials", allowCredentials);
    }
    if (!StringUtils.isEmpty(allowHeaders)) {
      response.setHeader("Access-Control-Allow-Headers", allowHeaders);
    }
    if (!StringUtils.isEmpty(exposeHeaders)) {
      response.setHeader("Access-Control-Expose-Headers", exposeHeaders);
    }
    filterChain.doFilter(servletRequest, servletResponse);
  }

  @Override
  public void destroy() {

  }
}

大功告成,现在前端就可以跨域获取后台的数据了,比其它方式容易得多,代码就不解释了,简单易懂,使用其它后台开发方式也一样,最终目的就是判断请求,设置响应头,前端什么事都不用做。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java实现CORS跨域  # Java  # CORS跨域  # CORS跨域请求  # JAVA通过Filter实现允许服务跨域请求的方法  # 详解java 中Spring jsonp 跨域请求的实例  # 详解Java Ajax jsonp 跨域请求  # Java利用cors实现跨域请求实例  # 使用CORS实现JavaWeb跨域请求问题的方法  # 解决跨域请求  # NG返回403(403并不一定是NG问题)  # 几种  # 服务端  # 后端  # 这是  # 就会  # 在这里  # 在这  # 有很多  # 是这样  # 就不  # 会在  # 这是一个  # 得多  # 要做  # 大功告成  # 自定义  # 不支持  # 一个问题  # 不需  # 在前 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Swift中循环语句中的转移语句 break 和 continue  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  网站制作大概多少钱一个,做一个平台网站大概多少钱?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  中山网站推广排名,中山信息港登录入口?  Laravel怎么为数据库表字段添加索引以优化查询  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何快速生成ASP一键建站模板并优化安全性?  南京网站制作费用,南京远驱官方网站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel怎么判断请求类型_Laravel Request isMethod用法  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  韩国服务器如何优化跨境访问实现高效连接?  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  Python进程池调度策略_任务分发说明【指导】  javascript中对象的定义、使用以及对象和原型链操作小结  Python图片处理进阶教程_Pillow滤镜与图像增强  如何用搬瓦工VPS快速搭建个人网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  如何快速查询网址的建站时间与历史轨迹?  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何处理异常和错误?(Handler示例)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在Windows虚拟主机上快速搭建网站?  如何快速搭建支持数据库操作的智能建站平台?  高端云建站费用究竟需要多少预算?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  Angular 表单中正确绑定输入值以确保提交与验证正常工作  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何用PHP快速搭建高效网站?分步指南  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  实例解析angularjs的filter过滤器  打造顶配客厅影院,这份100寸电视推荐名单请查收  bing浏览器学术搜索入口_bing学术文献检索地址  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  潮流网站制作头像软件下载,适合母子的网名有哪些?  如何快速辨别茅台真假?关键步骤解析  java中使用zxing批量生成二维码立牌  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】