java 解决跨域时遇到问题,怎么来做一个跨域环境

今天遇到一个问题:

关于#java#的问题:java 解决跨域时遇到问题:为什么跨域访问时配置的CorsFilter没有进入?直接访问请求地址时进入了配置的CorsFilter

由于没有实际的跨域环境,因此打算在本机建一个跨域环境,以便后边测试。

思路:

nodejs启动一个服务器,转发访问的请求到后端javaweb服务器

使用到的就是nodejs的express插件来搭建 。

从网上查找了资料和GPT的帮助,找到2个插件可以实现这个想法。

一个常用的中间件是http-proxy-middleware。下面是使用Express和http-proxy-middleware来转发请求的基本步骤:

首先,确保你已经安装了Express和http-proxy-middleware。如果没有安装,可以通过npm来安装:

npm install express http-proxy-middleware

接下来,在你的Node.js应用中设置转发请求:

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');const app = express();// 配置转发规则
const apiProxy = createProxyMiddleware({target: 'http://target-api-server.com', // 目标API服务器地址changeOrigin: true, // 是否改变源到目标URL,默认false,当目标URL与源URL的协议或域名不同时需要设置为truepathRewrite: { '^/api': '' }, // 路径重写,例如将/api前缀替换为空,以便正确路由到目标服务器onProxyRes: function(proxyRes, req, res) {// 可以在这里处理响应,比如修改响应头等},onError: function(err, req, res) {res.status(500).send('Something went wrong while forwarding the request');},
});// 使用中间件进行请求转发
app.use('/api', apiProxy);// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});

在这个例子中,任何以/api开头的请求都会被转发到http://target-api-server.comchangeOrigin设置为true表示将请求源头改为目标服务器,这对于那些校验请求来源的应用来说非常重要。pathRewrite选项可以用来修改请求路径,以匹配目标服务器的API路径结构。

请根据你的具体需求调整上述代码中的目标URL以及其他配置选项。

我本机的实际代码是:

const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');const app = express();// 配置转发规则
const apiProxy = createProxyMiddleware({target: 'http://localhost:8080/jsp_cros_test', // 目标API服务器地址changeOrigin: true, // 是否改变源到目标URL,默认false,当目标URL与源URL的协议或域名不同时需要设置为truepathRewrite: { '^/api': '' }, // 路径重写,例如将/api前缀替换为空,以便正确路由到目标服务器onProxyRes: function(proxyRes, req, res) {// 可以在这里处理响应,比如修改响应头等},onError: function(err, req, res) {res.status(500).send('Something went wrong while forwarding the request');},
});// 使用中间件进行请求转发
app.use('/api', apiProxy);// 启动服务器 process.env.PORT || 3000
const PORT = 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});

不过我本机的nodejs版本是v12.18.2,因此http-proxy-middleware高版本不合适,需要降级:

npm uninstall http-proxy-middleware
npm install http-proxy-middleware@^1

运行效果: 

第二种是使用express-http-proxy在Node.js中通过Express框架来转发请求是一种常见的做法。以下是使用express-http-proxy来设置请求转发的步骤:

首先,确保你已经安装了Express和express-http-proxy。如果还没有安装,可以通过npm来安装:

npm install express express-http-proxy

 然后,你可以按照以下示例代码设置请求转发:

const express = require('express');
const proxy = require('express-http-proxy');const app = express();// 配置代理中间件
app.use('/api', proxy('http://target.api.example.com', {// 可选配置项proxyReqPathResolver: function(req) {// 自定义路径解析逻辑,可以根据需要调整转发到目标服务器的实际路径return '/custom/path/on/target' + req.url;},userResHeaderDecorator: function(headers, userReq, userRes, proxyRes) {// 处理或添加响应头headers['X-Special-Header'] = 'Special-Value';return headers;},filter: function(req, res) {// 可以根据请求条件决定是否进行代理return true; // 返回true表示所有请求都转发,false则不转发},forwardPath: function(req, res) {// 修改请求路径,适用于需要对原始请求路径进行转换的场景return req.originalUrl.replace('/api', '');},// 更多配置项请参考express-http-proxy的文档
}));const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Proxy server is running on port ${PORT}`);
});

在这个例子中,所有以/api开头的请求会被转发到http://target.api.example.com。你可以通过proxyReqPathResolveruserResHeaderDecoratorfilterforwardPath等配置项来定制转发逻辑,比如修改请求路径、添加响应头、过滤请求或在转发前修改请求路径等。

请根据你的具体需求调整这些配置选项。记得替换http://target.api.example.com为你要实际转发到的目标API地址。

不过我试验之后提示报错:

forwardPath and forwardPathAsync are DEPRECATED and should be replaced with proxyReqPathResolver

 就是不支持的属性,我实际测试后,可以运行的配置如下:

const express = require('express');
const url = require('url');
const proxy = require('express-http-proxy');const app = express();app.use('/api', proxy('http://localhost:8080', {proxyReqPathResolver: function(req) {// 确保去除/api前缀return "/jsp_cros_test"+ req.url.replace(/^\/api/, '');},// 添加代理请求选项装饰器,用于打印实际请求的URLproxyReqOptDecorator: function(proxyReqOpts, srcReq) {console.log('Proxy request will be sent to:', srcReq.url);return proxyReqOpts; // 确保返回修改后的选项对象},filter: function(req, res) {// 可以根据请求条件决定是否进行代理return true; // 返回true表示所有请求都转发,false则不转发},}));const PORT = 3001;
app.listen(PORT, () => {console.log(`Proxy server is running on port ${PORT}`);
});

后端结构:

 

希望本文可以帮助到你,谢谢阅读。 

(完)

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

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

相关文章

庙算兵棋推演AI开发初探(4-调用AI模型)

前面讲了如何开展编写规则脚本型Agent(智能体)的方法,现在探究一下如何调用知识型(一般而言的训练出的模型)智能体的方法。 这次调用的是庙算平台的demo(网址见图) 下载了“知识强化学习型”…

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

力扣HOT100 - 763. 划分字母区间

解题思路&#xff1a; class Solution {public List<Integer> partitionLabels(String s) {int[] last new int[26];int len s.length();for (int i 0; i < len; i) {last[s.charAt(i) - a] i;//记录字母最远的下标}List<Integer> partition new ArrayList…

java spring boot动态数据库获得配置信息连接多数据源(数据库)

数据库 数据库文件和代码文件 https://download.csdn.net/download/qq_34631220/89304173 链接&#xff1a;https://pan.baidu.com/s/1xoh6xiSRx4nW_gKvR1QPjg 提取码&#xff1a;i7b7 –来自百度网盘超级会员V5的分享 文章位置 添加链接描述 说明&#xff1a;事务只能单库…

学习软考----数据库系统工程师32

NoSQL非关系型数据库 CAP理论和BASE特性 关系型数据库主要使用ACID理论 各种NoSQL数据 库的分类与特点

中国海洋大学整体来说值得报考吗?中国海洋大学考情分析。

中国海洋大学&#xff08;Ocean University of China&#xff09;&#xff0c;简称中国海大。位于中国青岛&#xff0c;是中华人民共和国教育部直属的综合性重点大学&#xff0c;国家“双一流”、“985工程”和“211工程”重点建设高校之一&#xff0c;入选“2011计划”、“111…

RT-Thread事件集

文章目录 前言一、RT-Thread事件集的概念二、事件集函数的使用1.创建事件集函数2.事件集发送函数3.事件集接收函数4.事件集删除函数 三、事件集使用例程总结 前言 本篇文章将给大家讲解RT-Thread中事件集的概念&#xff0c;了解什么是事件集及事件集的函数使用方法。 一、RT-…

Lesson5--二叉树(超详细版)

【本节目标】 1. 树概念及结构 2. 二叉树概念及结构 3. 二叉树顺序结构及实现 4. 二叉树链式结构及实现 1.树概念及结构 1.1树的概念 树是一种 非线性&#xff08;线性结构就是顺序表链表&#xff09; 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个…

Linux 第三十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

ms17-010(永恒之蓝)

1.漏洞介绍: 永恒之蓝&#xff08;ms17-010&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒之蓝”制作了wannacry勒索病…

国际护士节庆祝活动向媒体投稿有方法很轻松

作为一名医院职工,我肩负着医院对外信息宣传的重任。在国际护士节这个特殊的日子里,我们医院举办了一系列庆祝活动,以表彰护士们的辛勤付出和无私奉献。然而,在将这些活动信息投稿至媒体的过程中,我最初却遭遇了诸多挑战。 起初,我采用传统的邮箱投稿方式,将精心撰写的稿件发送…

RabbitMq出现Not management user问题解决

在RabbitMq登录的时候突然弹出如下图&#xff1a; 提示“当前用户不是管理员用户”进入mq控制命令台下&#xff1a; windows版本在mq安装路径下的sbin下进入cmd弹出框&#xff1b; Linux版本没有测试&#xff1b; 输入以下命令&#xff1a; rabbitmqctl list_users 查询当…

栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

一.有效的括号 ​​​OJ链接 这一道题我们就可以用栈来解决&#xff1a; 不了解栈的可以看我的上一篇博客。 typedef char STDataType; //用数组来实现栈 typedef struct stack {STDataType* a;int capacity;int top; }ST; void STInit(ST* pst) {assert(pst);pst->a NU…

内网环境安装使用DBeaver使用第一天

之前一直使用navicat&#xff0c;现在出于某种原因不让使用了&#xff0c;于是上手了这个工具&#xff0c;说实话&#xff0c;真的&#xff0c;但是必须要用。 首先安装的时候&#xff0c;必须要选择MySQL驱动&#xff0c;如果外网直接选择以后就可以下载了&#xff0c;内网需…

字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

字符串函数 一.strcpy&#xff08;字符串拷贝&#xff09;1.函数使用2.模拟实现 二.strcat&#xff08;字符串追加&#xff09;1.函数使用2.模拟实现 三.strcmp&#xff08;字符串比较&#xff09;1.函数使用2.模拟实现 四.strncpy1.函数使用2.模拟实现 五.strncat1.函数使用2.…

采油厂职工向媒体投稿的好方法找到了

作为一名采油厂的职工,我深知在媒体上定期投稿的重要性。这不仅是我们展示工作成果、传播企业文化的重要途径,更是上级考核我们工作表现的一项指标。然而,在投稿的过程中,我经历了不少心酸与困扰。 起初,我采用传统的邮箱投稿方式。每天,我都会花费大量时间在网络上搜索合适的媒…

Linux----正则表达式练习题题解

1、 显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行&#xff1b; [rootopenEuler ~]# grep -E "^(H|h)" /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt 注&#xff1a;当然也可以使用grep -i来实现&#xff0c;这里我换了一个文件&#xff08;/etc/passw…

基于SPWM控制策略的二极管钳位型的五电平逆变器simulink仿真

本人搭建了二极管钳位型五电平逆变器simulink仿真模型&#xff0c;SPWM采用层叠&#xff0c;输出线电压9电平&#xff0c;相电 压5电平&#xff0c;滤波后对称三相电压、电流&#xff0c;THD<5%&#xff0c;效果十分优越&#xff0c;适合新手学习使用。 模型获取链接&…

使用apache和htaccess对目录访问设置密码保护配置教程

对目录设置密码保护配置说明 我们有时候访问某些网站的时候&#xff0c;要求输入用户名和密码才能访问。这是为了保护隐私&#xff0c;只让经过许可的人访问。 在本教程中主要介绍两种方法&#xff0c;一种是通过apache httpd.conf配置文件对管理后台目录设置密码保护&#xff…

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波&#xff0c;QRS波群反映左、右心室除极电位和时间的变化&#xff0c;第一个向下的波为Q波&#xff0c;向上的波为R波&#xff0c;接着向下的波是S波。通过GUI进行数据处理&#xff0c;展示心率和QRS。程序已调通&#xff0c;可…