记一次CORS踩坑记录

简介: 之前某一次远程工作的内容是配置并且实现CORS的跨域访问,本来特别简单的问题,却因为Spring的封装“坑”的有点惨,而且涉及一个IE浏览器跨域失败的问题处理比较麻烦,下面为整个cors跨域问的解决记录和笔记。

前言


之前某一次远程工作的内容是配置并且实现CORS的跨域访问,本来特别简单的问题,却因为Spring的封装“坑”的有点惨,而且涉及一个IE浏览器跨域失败的问题处理比较麻烦,下面为整个cors跨域问的解决记录和笔记。


什么是ajax跨域?


简单来说就是如果使用ajax访问不同端口的IP等非同源的资源,就会出现跨域,比如下面的网址就会产生跨域的问题。



下面是跨域的相关报错信息,如果产生跨域我们将无法访问相关的服务器资源,并且通常会给予一定的提示信息:


XMLHttpRequest cannot load . No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.xyz.com' is therefore not allowed access.

如果一个资源跨域,那么浏览器是无法获取下面这些信息的:


(1) Cookie、LocalStorage 和 IndexDB 无法读取。


(2) DOM 无法获得。


(3) AJAX 请求不能发送。


跨域算是浏览器常见的一个稍微让人头疼的问题,在html5之前几乎只能通过jsonp的方式解决,不过html5出现之后,为ajax跨域解决了不少的问题。


常见的解决方式


常见的解决方式如下:

  • Jsonp:使用的是 Js回调函数的方式,配置比如http://xxxx.com?call=func(),这时候可以使用<script></script>标签行包裹,并且设置src标签,最后发送给服务端处理完成之后进行回调函数的解析即可,这里也有一种方式是使用js的eval()函数调用脚本代码,当然jsonp的处理方式只能支持get调用,局限性过大。
  • Cross-Origin Resource Sharing 跨域资源共享, CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domain)的脚本请求访问的机制。


由于html5新增了cors的支持,并且现在几乎没有那个网页不是html5,最终我们使用cors的方案即可,jsonp的方式基本可以忘记。


踩坑原因


由于每个人的项目环境不一,这里仅个个人环境配置遇到的问题。


  1. 如果存在web.xml 配置,访问的时候会忽略掉其他的任何形式的配置,只生效xml配置
  2. 项目中配置允许post跨域无效并且只能get跨域访问,原因未知,或许为堡垒机的拦截?


解决过程


  1. 在请求当中加入@crossxxx注解,发现无效
  2. 将请求改为具体的RequestMethod.GET 或者POST发现情况依旧
  3. 最后使用了spring cors的解决方式,但是发现也不是加个注解就万事大吉了


参考博客


网上的博客有许多的参考解决方案

segmentfault.com/a/119000001… segament一个博客,写得非常棒【推荐】

其他资料:

www.imooc.com/qadetail/30…www.jianshu.com/p/f3840c8c0… 简书介绍CORS

blog.csdn.net/doujinlong1… 【业务知识——Logger日志打印规范】

www.cnblogs.com/doit8791/p/… 【聊聊日志打印规范问题】 研发的同时抽时间看下

解决办法


解决办法就是使用了Spring的方式配置


更改之后的配置


1.使用pom.xml加入新的依赖,使用Cors的原生支持


JAVA后台配置只需要遵循如下步骤即可:


  • 第一步:获取依赖jar包


下载 cors-filter-1.7.jar, java-property-utils-1.9.jar 这两个库文件放到lib目录下。(放到对应项目的webcontent/WEB-INF/lib/下)


  • 第二步:如果项目用了Maven构建的,请添加如下依赖到pom.xml中:(非maven请忽视)


<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>[ version ]</version>
</dependency>

其中版本应该是最新的稳定版本,CORS过滤器


2.在web.xml当中增加如下配置


3.配置的更详细介绍在上面提到的博客当中,这里不多赘述


下面是和web.xml的有关配置信息。


<!-- 跨域配置:参考 http://www.thomasyoung.cn/fontend/2017/04/01/ajax-session/-->
    <filter>
        <!-- 原生Cors过滤器配置 -->
        <filter-name>CorsFilter</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
        <!--
    非跨域请求是否可以通过此过滤器,默认为true;如果设置为false,则只有跨域的请求被允许
          -->
        <init-param>
            <param-name>cors.allowGenericHttpRequests</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>cors.allowOrigin</param-name>
            <param-value>http://192.168.92.190:8080,http://192.168.92.145:8080,</param-value>
        </init-param>
        <!--
        是否允许来自allowOrigin的子域名的请求,默认不允许;子域名的概念大家应该清楚,www.example.com是example.com的子域名
        -->
        <init-param>
            <param-name>cors.allowSubdomains</param-name>
            <param-value>false</param-value>
        </init-param>
        <!-- cors.allowed.methods -->
        <init-param>
            <param-name>cors.supportedMethods</param-name>
            <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
        </init-param>
        <!-- cors.allowed.headers -->
        <init-param>
            <param-name>cors.supportedHeaders</param-name>
            <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
        </init-param>
        <init-param>
            <param-name>cors.exposedHeaders</param-name>
            <!--这里可以添加一些自己的暴露Headers   -->
            <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
        </init-param>
        <!-- 对应 cors.support.credentials -->
        <init-param>
            <param-name>cors.supportsCredentials</param-name>
            <param-value>true</param-value>
        </init-param>
        <!-- cors.preflight.maxage 最大缓存时间 -->
        <init-param>
            <param-name>cors.maxAge</param-name>
            <param-value>10</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CorsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

IE8/IE9 解决拒绝访问的问题


由于遇到此问题的时候要求希望可以兼容IE,所以通过查阅各种网络资料发现了下面的一些参考。


第一种:引入js文件


通过引入下面的js之后让ie可以支持某些jquery调用的缺失的底层方法(真尼玛坑)。


<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js" type="text/javascript" charset="utf-8"></script>

第二种:Jquery开启跨域模式


如果使用jquery在发送请求之前可能需要使用下面设置来允许跨域,当然不一定总是需要。


jQuery.support.cors = true

总结


更多是工作遇到问题的临时笔记处理,cors基本查查资料就能很快掌握,html5之后出现cors解决了不少的问题。

相关文章
|
开发工具 Android开发 iOS开发
【教程】app备案流程简单三部曲即可完成
2. 应用信息登记:开发者需要在应用商店或应用发布平台上进行应用信息登记,填写应用名称、应用版本号、应用描述、应用类型、所属类别、收费方式、开发机构、联系方式等信息。这些信息将会被展示在应用商店或应用发布平台上,供用户查看。
|
存储 Kubernetes NoSQL
无锁队列实现及使用场景
无锁队列实现及使用场景
|
6月前
|
人工智能 自然语言处理 Linux
自然语言到可运行代码:OpenClaw技术原理、部署及大模型api配置与工程化应用指南
人工智能在代码生成领域的落地,正在系统性改变软件开发的工作流程。OpenClaw作为一类能够理解自然语言需求并输出完整代码结构的AI辅助工具,已经从概念阶段进入实用阶段。它能够接收用户以日常语言描述的功能需求,自动生成函数、类、接口乃至完整模块,在规范写法、减少重复劳动、提升交付速度方面表现突出。但与此同时,这类工具也存在明确的能力边界与使用前提,需要开发者以理性、审慎的方式接入日常开发流程。本文从技术原理、实际体验、效率价值、职业影响、学习门槛与未来趋势出发,完整呈现OpenClaw的真实定位,并提供2026年阿里云、Windows 11、macOS、Linux四大环境的标准化部署流程,同时
1099 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
585 0
基于VisualGLM-6B大模型的本地部署与推理
本文是基于清华开源的VisualGLM-6B 支持图像中英文的多模态对话语言模型,进行了一系列本地的简单部署,包括环境配置、模型部署、演示推理、模型微调(官方提供的代码),由于个人电脑显存不足,最后是在阿里云服务器交互式平台DSW终端进行微调和训练操作的。
620 17
|
Ubuntu 关系型数据库 MySQL
在Ubuntu 22.04上配置和安装MySQL
以上就是在Ubuntu 22.04上配置和安装MySQL的步骤。这个过程可能看起来有点复杂,但只要按照步骤一步步来,你会发现其实并不难。记住,任何时候都不要急于求成,耐心是解决问题的关键。
1674 31
|
弹性计算 Linux 数据安全/隐私保护
阿里云服务器最新购买流程与试用流程参考,购买与试用图文教程和注意事项
如何购买和试用阿里云服务器,教程参考来了。阿里云服务器分为免费版和收费版,新用户可免费领取一台云服务器作为试用,轻量应用服务器2核2G目前38元1年,云服务器ECS2核2G3M的价格为99元1年,2核4G5M配置199元1年,下面小编来介绍一下2025年我们购买和试用阿里云服务器的详细流程,以图文形式展示给大家,适合新手用户参考。
阿里云服务器最新购买流程与试用流程参考,购买与试用图文教程和注意事项
|
SQL JavaScript 数据库连接
Seata的工作原理
【10月更文挑战第30天】
940 3
|
存储 NoSQL Redis
redis zset底层数据结构
zset底层存储结构  zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下: 有序集合保存的元素数量小于128个 有序集合保存的所有元素的长度小于64字节  当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个元素保存元素的分值。
16894 1
|
Kubernetes Docker 容器
容器运行时Containerd k8s
容器运行时Containerd k8s
394 3

热门文章

最新文章