全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

问题

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

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

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问题)  # 几种  # 服务端  # 后端  # 这是  # 就会  # 在这里  # 在这  # 有很多  # 是这样  # 就不  # 会在  # 这是一个  # 得多  # 要做  # 大功告成  # 自定义  # 不支持  # 一个问题  # 不需  # 在前 


相关文章: 如何用wdcp快速搭建高效网站?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何在建站之星网店版论坛获取技术支持?  网站制作壁纸教程视频,电脑壁纸网站?  个人摄影网站制作流程,摄影爱好者都去什么网站?  建站主机选哪种环境更利于SEO优化?  做企业网站制作流程,企业网站制作基本流程有哪些?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  定制建站是什么?如何实现个性化需求?  网页设计网站制作软件,microsoft office哪个可以创建网页?  ,巨量百应是干嘛的?  北京的网站制作公司有哪些,哪个视频网站最好?  个人网站制作流程图片大全,个人网站如何注销?  公司网站的制作公司,企业网站制作基本流程有哪些?  建站之星安装步骤有哪些常见问题?  C#怎么创建控制台应用 C# Console App项目创建方法  如何通过虚拟主机快速完成网站搭建?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  重庆市网站制作公司,重庆招聘网站哪个好?  高端企业智能建站程序:SEO优化与响应式模板定制开发  建站之星安装后如何配置SEO及设计样式?  营销式网站制作方案,销售哪个网站招聘效果最好?  建站之星免费版是否永久可用?  三星网站视频制作教程下载,三星w23网页如何全屏?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  网站设计制作企业有哪些,抖音官网主页怎么设置?  如何安全更换建站之星模板并保留数据?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  建站之星各版本价格是多少?  如何在阿里云高效完成企业建站全流程?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何用好域名打造高点击率的自主建站?  开源网站制作软件,开源网站什么意思?  如何在Windows 2008云服务器安全搭建网站?  测试制作网站有哪些,测试性取向的权威测试或者网站?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?    如何彻底删除建站之星生成的Banner?  如何用VPS主机快速搭建个人网站?  详解jQuery停止动画——stop()方法的使用  C#如何在一个XML文件中查找并替换文本内容  制作农业网站的软件,比较好的农业网站推荐一下?  如何配置支付宝与微信支付功能?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  如何快速上传自定义模板至建站之星? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。