Spring Security实战(六)—— 跨域与CORS

news2024/11/23 10:41:28

跨域是一种浏览器同源安全策略,即浏览器单方面限制脚本的跨域访问。

一、认识跨域

        跨域(Cross-Origin)指的是在Web开发中,当一个网页的内容要从不同源(即不同的域名、协议或端口)获取时,就会发生跨域问题。浏览器会根据“同源策略”(Same-Origin Policy)的限制阻止网页从其他域名下的资源(如JavaScript、CSS、图片等)获取数据或调用其他网站的API接口。

        同源策略是浏览器实现的一种安全策略,它限制了一个网页的脚本只能访问同源下的资源,而不能跨域访问其他域名下的资源,这样可以防止恶意的脚本窃取用户的敏感信息。跨域问题是Web开发中比较常见的问题,需要特别处理才能解决。

二、实现跨域之JSONP

        SONP(JSON with Padding)是一种跨域请求的解决方案,它利用了script标签没有跨域限制的特性来实现。JSONP的原理是利用了script标签可以跨域加载资源的特性,通过动态创建一个script标签,将需要获取数据的URL作为其src属性,再在URL中加入一个回调函数的名称,服务器在返回数据时,将数据包装在该回调函数中,前端页面通过该回调函数获取数据。

以下是JSONP的一个示例:

后端代码:

在这个例子中,后端会返回一个JSON对象,对象的内容是一个名为John的人的姓名和年龄30。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class JsonpServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/javascript;charset=utf-8");
        PrintWriter out = response.getWriter();
        String callback = request.getParameter("callback");
        String jsonpStr = callback + "({\"name\":\"John\",\"age\":30})";
        out.print(jsonpStr);
        out.flush();
        out.close();
    }
}

前端代码:

在这个例子中,当用户点击“获取数据”按钮时,会动态创建一个script标签,并设置其src属性为http://localhost:8080/jsonp?callback=callback,其中callback是前端定义的回调函数名。浏览器会自动加载该URL,从而触发服务器的请求。服务器在返回数据时,将数据包装在callback函数中,最终在前端页面中调用callback函数,从而获取数据并输出到控制台。

<!DOCTYPE html>
<html>
<head>
    <title>JSONP示例</title>
    <script>
        function callback(data) {
            console.log(data);
        }
    </script>
</head>
<body>
    <button onclick="getData()">获取数据</button>

    <script>
        function getData() {
            var script = document.createElement('script');
            script.src = 'http://localhost:8080/jsonp?callback=callback';
            document.head.appendChild(script);
        }
    </script>
</body>
</html>

三、实现跨域之CORS       

        CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种机制,用于在跨域访问时,允许网页的某些请求能够获得来自其他域的服务器资源。在同源策略(Same-Origin Policy)限制下,浏览器只允许当前网页与同一域名下的服务器进行交互,而CORS则是一种解决跨域问题的方案。

        当浏览器发起跨域请求时,例如在网页中向其他域名的服务器发起请求,会被浏览器拦截,并发送一个预检请求(preflight request)给服务器。服务器在收到预检请求后,可以在响应头中设置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等字段,来告知浏览器哪些请求是被允许的。如果服务器返回的响应头中包含了与请求所设置的Origin、Method、Headers等相匹配的字段,那么浏览器就会允许该请求发送,并将响应内容返回给网页。

        CORS的实现需要客户端和服务端的双重支持,一般需要服务端进行相关的配置,以便允许客户端跨域访问。

四、启用Spring Security的CORS支持

        spring security对CORS提供了非常好的支持,只需在配置器中启用CORS支持,并编写一个CORS配置源即可。

 

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        //允许从百度站点跨域
        configuration.setAllowedOrigins(Arrays.asList("https://www.baidu.com"));
        //允许使用GET和POST方法
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        //允许带凭证
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        //对所有URL生效
        source.registerCorsConfiguration("/**",configuration);
        return source;
    }

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

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

相关文章

时序分析与时序约束知识总结

文章目录 时序分析如何查看时序报告时序分析的分类和任务HOLD违例修复&#xff1a;SETUP违例修复&#xff1a;时序违例的修复 时序约束约束的分类时序约束的作用SDF文件OCVPVT共同路径悲观效应(CPP)setup time与hold time和什么有关clock Jitter与clock Skewsetup和hold裕度计算…

10.java程序员必知必会类库之邮件

前言 邮件功能在当前互联网应用中已经是很成熟的功能&#xff0c;也是作为java程序员应该掌握的技能。常见使用场景有&#xff1a; 电商软件开电子发票&#xff0c;需要发到用户邮箱里面生产实时报警&#xff0c;需要发到邮箱里面银行软件申请的征信报告&#xff0c;电子账单…

Django框架之Admin站点管理

Django的强大体现在其内置的Admin模块可以使得开发人员在不做任何编码的情况下就拥有网站后台管理功能。 概述 内容发布&#xff1a;负责添加、修改、删除内容 内容访问查看 配置admin应用 在settings.py中添加django.contrib.admin 默认已添加 创建管理员账户 python man…

九、1~8文章的阶段案例

一、案例 现在我们来做一个相对综合一点的练习&#xff1a;书籍购物车 案例说明&#xff1a; 1.在界面上以表格的形式&#xff0c;显示一些书籍的数据&#xff1b;2.在底部显示书籍的总价格&#xff1b;3.点击或者-可以增加或减少书籍数量&#xff08;如果为1&#xff0c;那…

【论文精读】ISBI 2022 - Retinal Vessel Segmentation with Pixel-wise Adaptive Filters

【论文精读】ISBI 2022 - Retinal Vessel Segmentation with Pixel-wise Adaptive Filters 【论文原文】&#xff1a;Retinal Vessel Segmentation with Pixel-wise Adaptive Filters 【作者信息】&#xff1a;Li, Mingxing and Zhou, Shenglong and Chen, Chang and Zhang, …

【Linux】线程-线程控制

线程控制 线程控制线程创建线程终止线程等待分离线程 线程控制 使用线程需要注意的是&#xff0c;需要引入头文件pthread.h&#xff0c;并且在编译的时候&#xff0c;需要使用-lpthread 线程创建 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*…

QT中TCP的学习

文章目录 qt中TCP的实现 qt中TCP的实现 学习视频 QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程 下方的信号都是系统提供的&#xff0c;我们只需要写相应的槽函数 A、服务器&#xff1a; 创建QTcpServer对象启动服务器&#xff08;监听&…

Flutter ListView组件详解

今天是2023年4月24日 今天重新复习了一下关于ListView的内容&#xff0c;现在就重新整理一下关于ListView的内容和理解 : (1)ListView和Column之间有什么区别&#xff1f; 在我理解中ListView和Column都是可以有很多子组件的组件&#xff0c;它们之间区别在于它们排列的形式和…

python实现AI写歌词GUI版本【文末源码】

**引言&#xff1a;**自然语言处理作为人工智能的一个重要分支&#xff0c;在我们的生活中得到了广泛应用。其中RNN算法作为自然语言处理的经典算法之一&#xff0c;是文本生成的重要手段。而今天我们就将利用RNN算法建立一个写歌词的软件。其中的界面如下&#xff1a; RNN指的…

使用binding时,LayoutSubscribeFragmentBinding报错

LayoutRecommendFragmentBinding是一个DataBinding类&#xff0c;它由编译器自动生成&#xff0c;用于访问布局文件中的视图。如果你在代码中看到LayoutRecommendFragmentBinding报红&#xff08;提示未解析的引用&#xff09;&#xff0c;可能有以下原因&#xff1a; 1. 检查…

Docker 的数据管理(dockerfile)

Docker 的数据管理&#xff08;dockerfile&#xff09; 管理 Docker 容器中数据数据卷数据卷容器端口映射 容器互联&#xff08;使用centos镜像&#xff09;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建镜像…

Android主流网络请求开源库的对比

目录 一、为什么要用网络请求开源库&#xff1f; 网络请求开源库是一个将网络请求的相关功能封装好的类库 没有网络请求框架之前 App想与服务器进行网络请求交互是一件很痛苦的事&#xff1a;因为Android的主线程不能进行网络请求&#xff0c;需另开1个线程请求、考虑到线程池…

软件工程开发文档写作教程(03)—开发文档的必备条件

本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;电子工业出版社《软件文档写作教程》 马平&#xff0c;黄冬梅编著 必备条件概述 软件系统配备软件文档不仅对于公司非常有益&#xff0c;而且也能够让客户从中…

【Linux】【配置】网络连接

NetworkManager介绍 NetworkManager 是一个在 Linux 系统上管理网络连接的系统服务和工具。它可以自动配置和管理有线、无线、移动宽带和虚拟专用网络 (VPN) 连接&#xff0c;以及其他类型的网络连接。 NetworkManager 提供了一种简单且易于使用的方法来管理网络连接&#xff…

JSP、JSTL标签

<!-- JSTL的表达式的依赖--><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency><!--Standard标签库--><dependency><groupId>java…

QGroundControl之安装调试

QGroundControl之安装调试 1. 源由2. 问题汇总2.1 摄像头播放问题2.2 Windows电脑录像和拍照保存位置2.3 Android设备录像和拍照保存位置 3. 打包资料4. 附录-QGroundControl-Video Streaming5. 附录-QGroundControl效果图6. 参考资料 1. 源由 开源软件的好处就是免费&#xf…

数字政府智慧政务一网通办解决方案2022(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 建设成效 让政务服务全流程更“好办、智办” 智慧政务“111”架构 服务门户 统一入口、多端同步&#xff0c;一网融合、数据同源 服务门户 智能客服、智能问答、智能外呼实现…

2023一网通办一网统管一码互联一网共治建设方案(PPT可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 智慧城市基础平台的定位 智慧城市各模块的纵向关系 智慧城市-数据中枢整体架构 数据中枢在智慧城市定位 数据中枢定位1、数据中枢是智慧城市基础平台的核心组成部分&#x…

虚拟化技术 — VirtIO 虚拟设备接口标准

目录 文章目录 目录VirtIOVirtIO 虚拟设备接口标准VirtIO 的前后端分层架构标准VirtIO 的数控路径分离架构标准VirtIO 的传输层标准 VirtIO 标准在 Linux 中的实现 VirtIO VirtIO 由 Rusty Russell 开发&#xff0c;最初是为了支持自己开发的 lguest Hypervisor&#xff0c;其…

对象存储之SeaweedFS简介及与MinIO的对比

什么是SeaweedFS&#xff1f; SeaweedFS架构&#xff1a; master service【主服务】和Volume service【卷服务】一起提供分布式对象存储服务&#xff0c;支持用户配置数据的复制和冗余策略。可选的Filer service【过滤器】和S3 service【S3服务】是对象存储之上的附加层&#x…