首页 > 其他分享 >跨域问题如何解决

跨域问题如何解决

时间:2023-05-16 16:27:31浏览次数:40  
标签:Control 浏览器 跨域 如何 JSONP 解决 import 请求

跨域问题是由于浏览器的安全策略所导致的。如果在页面中向不同域名或端口号的服务器发送请求,浏览器就会拒绝响应,从而避免恶意网站获取用户的敏感信息。下面是几种解决跨域问题的方法:

  1. 通过在服务器端设置响应头来解决。服务器端需要设置Access-Control-Allow-Origin响应头,可以设置为允许请求的域名或*(表示允许所有域名的请求)。例如,如果你正在使用Node.js作为服务器,可以在响应头中添加以下内容:

package com.example.axiosdemo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * java中怎么通过在服务器端设置响应头来解决所有请求的跨域问题
 */
@WebFilter(filterName = "corsFilter", urlPatterns = {"/*"})
public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println(">>>>>>>>>>>>>>>CorsFilter init");
    }

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

        // 设置允许跨域访问的域名,*为所有
        response.setHeader("Access-Control-Allow-Origin", "*");

        // 设置允许的请求方法
        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");

        // 设置允许的请求头
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");

        // 设置响应的缓存时间,单位为秒
        response.setHeader("Cache-Control", "max-age=3600");

        // 放行请求
        chain.doFilter(req, res);
    }

    @Override
    public void destroy() {
        System.out.println(">>>>>>>>>>>>>>>CorsFilter destroy");
    }
}
  1. 使用JSONP(JSON with Padding)来解决。JSONP是一种利用<script>元素的“跨域”技术,它可以通过在URL中添加回调函数的名称来绕过浏览器的同源策略,并在客户端上执行返回的JavaScript代码。例如:

前端代码:

 function handleUserData(data) {
   console.log(data);
   // 处理数据的逻辑...
 }
 ​
 const userId = 123; // 用户 ID
 const url = `http://localhost:8080/user/${userId}?callback=handleUserData`;
 ​
 const script = document.createElement('script');
 script.src = url;
 document.body.appendChild(script);

这里的代码中,我们要从跨域的服务端(Spring Boot)获取用户数据。我们先定义了要请求的用户的 ID,然后将它与 API 的 URL 组合起来,同时在 URL 的末尾添加了一个名为 handleUserData 的回调函数参数。

接下来,我们动态地创建一个 <script> 标签,将 URL 设置为上面的 URL,因为我们使用的是 JSONP,所以我们不需要使用 XMLHttpRequest 或 Fetch API 来发起 AJAX 请求,用动态创建的 <script> 标签来发送 GET 请求即可。

最后,在 handleUserData 函数中,我们就可以对返回的数据进行处理了。

服务端代码:

服务端(Spring Boot)需要对接口进行相应的处理,来返回带有回车函数的 JSON 数据。

因为 Spring Boot 使用了 Jackson 库,因此我们可以很方便地实现对 JSONP 的支持。只需在控制器方法上添加 @ResponseBody 注解,并将返回值类型声明为 ResponseEntity<?> 即可。

下面是将用户数据转换为 JSONP 数据的示例代码:

 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 ​
 @RestController
 public class UserController {
 ​
     @GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
     @ResponseBody
     public ResponseEntity<String> getUserData(@PathVariable("id") Long userId, String callback) {
         UserData userData = //根据用户ID从数据库中获得用户数据
         String jsonData = new Gson().toJson(userData);
         
         // 将 JSON 数据转为 JSONP 数据
         String jsonpData = String.format("%s(%s)", callback, jsonData);
 ​
         // 返回 JSONP 数据
         return ResponseEntity.ok(jsonpData);
    }
 ​
 }

在方法上添加的 produces 设置了返回值是 json 类型的,然后将参数中的 callback 作为回调参数,用 GSON 库将数据转为 JSON 格式,然后将其转换为 JSONP 格式。

最后,实现的效果是前端可以从服务端获取到返回的 JSONP 数据,解析并使用其中的数据。

  1. 使用CORS(跨域资源共享)来解决。CORS是一种使用HTTP头来允许跨域请求的技术,它是浏览器和服务器之间的一种约定。在进行跨域请求时,浏览器会在请求中添加一个Origin头,服务器端在响应中添加Access-Control-Allow-Origin头来告诉浏览器允许跨域请求。例如:

 res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
  1. 使用代理服务器来转发请求。如果无法进行服务器端的设置,可以在客户端上创建一个代理服务器,然后将客户端的请求转发到目标服务器。通过代理服务器,客户端就可以绕过浏览器限制,向不同域名发送请求。

  2.  

 

标签:Control,浏览器,跨域,如何,JSONP,解决,import,请求
From: https://www.cnblogs.com/jdy1022/p/17405961.html

相关文章

  • 手把手教你如何下载超星学习通课件资料
    前言:很多同学都想知道超星学习通中课程资料怎么下载,但是超星学习通中某个课程的目录中展示的资料是不提供直接下载方式的,所以下面就教大家如何下载目录中展示的资料,包括PPT和PDF。一、电脑登录超星学习通网页版,复制课程链接网页版超星学习通登录入口:【https://i.chaoxing.com】......
  • Golang URL query contains semicolon 报错解决方案
    ​ 报错信息http:URLquerycontainssemicolon,whichisnolongerasupportedseparator;partsofthequerymaybestrippedwhenparsed;seegolang.org/issue/25192 高版本http废除了分号做分隔符,会在http库中做报警输出,基础库代码如下:func(shserverHandle......
  • jsp中实现文件上传下载的三种解决方案(推荐)
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 互联网用户之间如何传输大文件
    互联网用户之间如何传输大文件?现在的工作,基本上都离不开互联网,网络越来越发达,互联网传输大文件时常发生,但是有没有一款合适的大文件传输工具,很伤脑,下面整理了一些互联网用户之间如何传输大文件的方式,仅供参考。1、QQ传输作为在国内最早并且使用人数最多的即时聊天通讯,在文件传......
  • 如何做民主评议?
    民主评议党员是党的基层组织对党员进行的一种重要的监督方式,旨在教育党员、提高党员素质、保持党的先进性和纯洁性。民主评议党员的实施步骤如下:学习教育。通过学习党章党规、系列重要讲话精神和有关文件,提高党员对评议活动的认识,明确评议的目的、意义和要求,提高党员参加民主评......
  • 方芳:武汉市江夏区乡村公共基础设施建设项目融资的解决方案的构想
    武汉市江夏区乡村公共基础设施建设项目融资的解决方案的构想武汉市江夏区交通局武汉市江夏区公路局  武汉市江夏区公路建筑工程公司武汉市江夏城投集团有限公司武汉江夏路桥工程总公司 武汉工程大学 土木工程与建筑学院       方芳    1592760......
  • PLSQL Developer 15 中文乱码解决方法
    PLSQLDeveloper15汉字中文乱码解决方法 添加两个系统变量1.变量名:LANG变量值:zh_CN.GBK2.变量名:NLS_LANG变量值:SIMPLIFIEDCHINESE_CHINA.ZHS16GBK注意:上面的变量名和变量值最好使用复制粘贴的方式添加,防止手动填写出错。设置好后,点击“确定”按钮保存添加的环境变量。重......
  • 如何理解技术领导力
    1)决策力:迅速拍板并为结果负责的能力 技术管理者看到的情况,经常不是“两好选其优”,而是“两害取其轻”,要在信息不完全明确的情况下,迅速决定用哪个方案,并为结果负责,同时为了激励士气还不能表露出任何痛苦。要在这样的情况下迅速决策,而所有产生的问题和压力都要独立承担,而不能给......
  • Python-解决字符串编码UnicodeEncodeError错误
     data_results="123456789\u93b4\u612c\u59db\u2022"#将字符串转换为字节序列:使用encode方法将字符串转换为字节序列,并指定编码格式为utf-8print(data_results.encode('utf-8'))#使用encode方法将字符串转换为字节序列,并指定编码格式为gbk,使用ignore参数忽略无法处理的字......
  • 如何构建资源树
    创建数据结构CREATETABLE`menu`(`id`bigint(20)unsignedNOTNULLCOMMENT'主键',`name`varchar(11)NOTNULLCOMMENT'名称',`sort_no`smallint(5)unsignedNOTNULLDEFAULT'10'COMMENT'排序号',`parent_id`bigint(2......