$.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式

这篇文章不华丽,但比较实用,能解决不少大家实际业务中的问题。大家可以收藏起来,以备用时之需!

1.同源策略 

1.1 含义

  ajax出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”;1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。

最初,它的含义是指,A网页设置的 Cookie,B网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同"。

  • 协议相同

  • 域名相同

  • 端口相同

  举例来说,http://www.example.com/dir/page.html这个网址,协议是http://,域名是www.example.com,端口是80(默认端口可以省略)。它的同源情况如下:

  • http://www.example.com/dir2/other.html:同源

  • http://example.com/dir/other.html:不同源(域名不同)

  • http://v2.www.example.com/dir/other.html:不同源(域名不同)

  • http://www.example.com:81/dir/other.html:不同源(端口不同)

1.2 目的

  同源策略的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

  设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。

  由此可见,"同源策略"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

1.3 限制范围

  随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。

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

(2) DOM 无法获得。

(3) AJAX 请求不能发送。

2.解决Ajax请求不能发送的问题

  本文只关注Ajax请求跨域问题,想了解更多可以参考:http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html 

  同源政策规定,AJAX请求只能发给同源的网址,否则就报错。

  除了架设服务器代理(浏览器请求同源服务器,再由后者请求外部服务),有三种方法规避这个限制。

  • JSONP

  • WebSocket

  • CORS:(H5中的新特性:Cross-Origin Resource Sharing(跨域资源共享)。通过它,我们的开发者(主要指后端开发者)可以决定资源是否能被跨域访问。cors是一个w3c标准,它允许浏览器(目前ie8以下还不能被支持)像我们不同源的服务器发出xmlHttpRequest请求,我们可以继续使用ajax进行请求访问)

  本文中我们使用第三种方式来解决在Springboot项目中的跨域问题。前端发出Ajax请求访问Springboot(如在http://127.0.0.1:8086web项目中访问http://127.0.0.1:8866)服务时,Ajax跨域请求报错如下:

$.ajax({
            url : "http://127.0.0.1:8866/index",
            type : "GET",
            dataType : "text",
            success : function(msg) {
                $("#box").html(msg);
                alert(msg);
            }
        });

  Access to XMLHttpRequest at 'http://127.0.0.1:8866/' from origin 'http://127.0.0.1:8086' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

5fe44959304971080b2110db15411d6e.png

  在http://127.0.0.1:8866这个服务中,我们有三种解决方式:

2.1注解方式

  在需要跨域的Controller层的类或方法上加上注解:@CrossOrigin。这样就可以指定该controller中所有方法或某个方法处理所有或只来自http://127.0.0.1:8086中的请求。

@Controller
@CrossOrigin//@CrossOrigin(origins = "http://127.0.0.1:8086", maxAge = 3600)
public class ApiController {

    //@CrossOrigin
    @GetMapping(value = "/index")
    public String index(HttpServletRequest request) {
        request.getSession().setMaxInactiveInterval(60*30);

        return "index";
    }
}

2.2 过滤器方式

  修改返回请求头信息:

@Component
public class CorsFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(CorsFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers",
                "access-control-allow-origin, authority, content-type, version-info, X-Requested-With");

        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {

    }

}

2.3 继承WebMvcConfigurerAdapter,重写addCorsMappings方法:

@Component
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowCredentials(true)
        .allowedOrigins("*")
        .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
        .maxAge(3600) 
        .allowedHeaders("*");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高精度惯性传感器如何实现全球自动化愿景?

来源:MEMS如果农场基于丰富的传感器内容来联合利用自动化地面车辆和航空器,那么地面作业将更加有效;如果手术室能够将经典的导引技术供精密制导机械臂使用,那么成功率将得到保障;如果救援行动中能够精准定位施救人员的…

catia怎么将特征参数化_搭建商城网站怎么将页面简洁化?这三个步骤不能少

随着用户群体的年轻化,消费者的习惯也会开始转变,简洁的风格设计能帮助商家更快的吸引到用户。制作自己的商城系统来进行产品销售是常见的方式之一,商家需要做好自己的网站规划,并向开发商提出相应的要求。那么,今天就…

宇宙是一个图网络?「全球最聪明的人」刚刚为物理基础理论指出了全新道路...

来源:机器学习研究组订阅号图片来源:机器之心「物理学已经很长一段时间没有出现任何显著进展了。探测引力波或许算是一个,」斯蒂芬沃尔夫勒姆表示。「我非常希望在纯技术层面上,我们所做的一切能够使理论物理学重新焕发活力。尽管…

python3字典写入excel_Python玩转Excel(第2期)~这里只有干货

第1期发布之后,反响特别好,很快通过审核,不到2小时推荐量2600多,还是挺高的,说明大家对此版块内容还是感兴趣的,激发了我创作的动力。谢谢大家,今天加班再更新一期。一、如何创建数据的‘’粮仓…

信息通信业(ICT)十大趋势

来源:中国信息通信研究院,原文刊载于《互联网天地》2020年2期2019年12月26日,中国信息通信研究院在北京发布了信息通信业(ICT)十大趋势。这十大趋势是:1、5G时代起航,开辟数字化转型新空间2、信…

小括号教学设计导入_2020年小学教师资格证复习资料之小学课堂教学导入-教师吧...

本节内容为2020年下半年小学教师资格证考试科目二《教育教学知识与能力》小学课堂教学导入考点详解。【考点:小学课堂教学导入】一、课堂教学导入概述(一)教学导入的概念所谓教学导入,是指在上课之初,教师利用几分钟的时间,运用简洁的言语或行为,将学生的注意力吸引…

RPU4+1视图(转)

41视图模型概况 Kruchten 提出了一个"41"视图模型,从5个不同的视角包括包括逻辑试图、进程视图、物理视图、开发视图、场景视图来描述软件体系结构。每一个视图只关心系统的一个侧面,5个试图结合在一起才能反映系统的软件体系结构的全部…

牛客网数据开发题库_牛客网SQL题库NO.32~40

不要问为什么没有31题,大概被牛客吞掉了吧,哈哈哈哈SQL 32【简单】将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, firs…

VR/AR行业发展至今,它的市场规模如何

来源:AR工业应用全球知名研究咨询公司 Markets and Markets 2017 发布了一份研究报告,报告称:AR 市场规模将从 2016 年的 23.9 亿美金增长到 2023 年的613.9 亿美金。报告显示,诸如医疗保健、零售以及电商这样的行业对 AR头显不断…

为什么很难创造出新的处理器?

出品 | CSDN(ID:CSDNnews)译者 | Arvin,责编 | 郭芮以下为译文:RISC-V处理器指令集体系结构(ISA)的问世和最初的成功重新激发了人们对定制处理器设计的兴趣,但是业界现在正在努力解决…

情绪调节的自适应_如何做好情绪的管理者

积极有效的情绪管理一个人如果能够控制自己的情绪、欲望和恐惧,那他就胜过国王。----约翰米尔顿01情绪概述情绪和情感,人对客观外界事物的态度的主观体验和相应的行为反应,它反映的是主体需要和客观外界事物间的关系。情绪和情感两个词常可通…

科普 | 同一个世界,地图有这么多不同的表达!

来源:测绘学报一、地图投影的概念地球到底是什么样的?公元前6世纪,古希腊数学家毕达哥拉斯率先提出了“地圆说”。他在观察月食时,发现大地在月球上的投影是圆的,所以认为大地是完整的圆球体。他首次提出了“地球”这一…

解密脑机接口:专访CMU生物医学工程系主任贺斌

卡耐基梅隆大学生物医学工程系主任贺斌教授(照片由本人提供)来源: 知识分子撰文 | 李澄宇(中科院神经所PI)赵维杰(NSR新闻编辑)脑机接口能做什么?带上电极帽,你可以在实验…

Matlab画图技巧之消除空白

</pre>写报告或论文时,为了充分利用篇幅和实现紧凑美观,我们常常想要得到空白冗余较小的图,这在Tikz里面十分容易实现。但是在Matlab里需要做很多的工作才能达到目的。</p><p></p><p>Matlab默认的图空白十分大,看起来很别扭:</p><…

5G和北斗,交通行业新基建的正确打开方式

作者&#xff1a;湖南省交通运输厅科技信息中心 乔川龙物联网智库 整理发布转载请注明来源和出处导 读交通运输行业应该是5G先行区&#xff0c;一是符合5G的机会在于与2B垂直行业的深度融合、赋能行业转型升级和高质量发展的判断&#xff1b;二是根据交通运输行业的特点&#…

人工智能与人类智能的竞赛:人机对抗智能技术全梳理

作者: 黄凯奇*, 兴军亮, 张俊格, 倪晚成, 徐博来源&#xff1a;中国科学院自动化研究所智能系统与工程研究中心1引言人工智能从诞生之始就以对抗人类智能为衡量准则(著名的图灵测试) 。作为人工智能研究的前沿方向&#xff0c;人机对抗技术一直是国内外人工智能研究的热点,以人…

工业机器人 答案 韩建海_不可或缺:协作机器人对于制造业转型升级的意义

只要谈到自动化&#xff0c;就很难不提到协作机器人。自从十几年前协作机器人问世以来&#xff0c;它们便承担起了众多企业的自动化任务。新冠之前&#xff0c;英国制造业正在应对英国退欧和劳工短缺的不确定性。但是&#xff0c;他们无法预见新冠对行业的影响。任何行业都无法…

Python爬虫用Selenium抓取js生成的文件(一)

简介任务简述实现过程 简介 我最近在看关于计算机的一些书籍,发现了这个电子书清单:计算机开放电子书汇总, 和大家分享一下. 我在下载其中的书籍时被导向了这个很好的计算机电子书网站KanCloud看云,里面有非常多的实用的编程方面的电子书,很多是该网站自己用html生成的,格式多…

golang 升级到新版本_Scikit-learn新版本发布,一行代码秒升级

十三 发自 凹非寺 量子位 报道 | 公众号 QbitAIScikit-learn&#xff0c;这个强大的Python包&#xff0c;一直深受机器学习玩家青睐。而近日&#xff0c;scikit-learn 官方发布了 0.22 最终版本。此次的更新修复了许多旧版本的bug&#xff0c;同时发布了一些新功能。安装最新版…

重磅:2020年度获国家科学技术奖励提名的材料项目汇总

来源&#xff1a;http://www.nosta.gov.cn/upload/2020slxmgb/showProject.html转自&#xff1a;材料人2020年3月24日&#xff0c;科学技术部发布了《国家科学技术奖励工作办公室公告第95号》文件。这份文件对2020年国家自然科学奖、国家技术发明奖通用项目、国家科学技术进步奖…