http-proxy-middleware及express实现反向代理
$ npm install --save-dev http-proxy-middleware
npm install express
// 引用依赖
var express = require('express');
var proxy = require('http-proxy-middleware'); // proxy 中间件的选择项
var options = {
target: 'http://www.example.org', // 目标服务器 host
changeOrigin: true, // 默认false,是否需要改变原始主机头为目标URL
ws: true, // 是否代理websockets
pathRewrite: {
'^/api/old-path' : '/api/new-path', // 重写请求,比如我们源访问的是api/old-path,那么请求会被解析为/api/new-path
'^/api/remove/path' : '/path' // 同上
},
router: {
// 如果请求主机 == 'dev.localhost:3000',
// 重写目标服务器 'http://www.example.org' 为 'http://localhost:8000'
'dev.localhost:3000' : 'http://localhost:8000'
}
}; // 创建代理
var exampleProxy = proxy(options); // 使用代理
var app = express();
app.use('/api', exampleProxy);
app.listen();
https://www.cnblogs.com/resultwp/p/9945606.htm vue 非常规跨域实现 proxyTable 设置及依赖
、config/index.js 设置跨域的地址
proxyTable: {
'/api': { //跨域标识 请求地址为‘http://1xxx.xxx.com/index/list’, 请求时 “/api/index/list”
target: 'http://1xxx.xxx.com',
changeOrigin: true, //允许跨域
pathRewrite: { //重新跨域标识
'^/api': ''
}
}
}, 、build/webpack.dev.conf.js 引入express、http-proxy-middleware,如下:
const proxyMiddleware = require('http-proxy-middleware') var express = require('express')
var app = express()
// proxy api requests
const proxyTable=config.dev.proxyTable;
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
const express = require('express')
const app = express()
b、引入反向代理插件 http-proxy-middlewar
const proxyMiddlewar = require('http-proxy-middlewar')
代理配置
ok,这两个就是进行反向代理的准备工作。下面开始进行反向代理配置。首先,需要知道的是后端服务器的ip和端口号,
const proxyPath = 'http://168.96.0.1:8080' // 注意,这里只需要IP和端口号就可以了。这个ip我瞎写的
然后,将这个path配置到代理配置项中
const proxyOption = {target: proxyPath,changeOrigin: true}
现在用express使用这个代理就好了
app.use('/api', proxyMiddlewar(proxyOption)) // 下面详细说明这一段
app.listen() //表示监听的端口号也就是本地的端口号。用vue-cli构建的项目不需要写这行代码
express指定返回的拦截器处理:
const express = require("express");
const http = require("http");
const app = express();
////////////////////// 添加Log4js配置 /////////////////////////////
log.use(app);
////////////////////// 获取post过来的数据 /////////////////////////////
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
////////////////////// 设置web工程的根目录 /////////////////////////////
app.use(express.static(__dirname + '/'));
////////////////////// 允许跨域 /////////////////////////////
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
if(req.method=="OPTIONS") res.send();/*让options请求快速返回*/
else next();
});
////////////////////// 利用文件来拆分路由的规模 /////////////////////////////
var apiRouterIndex = require('./routes/api/apiRouterIndex');
app.use('/api', apiRouterIndex);
////////////////////// 404处理 /////////////////////////////
app.get('*', function (req, res){
console.log('404 handler..')
res.render('common_page/404.html', {
status: ,
title: 'NodeBlog',
});
});
const server = http.createServer(app).listen(,'localhost',function () {
const host = server.address().address;
const port = server.address().port;
// console.log("应用实例,访问地址为 http://%s:%s", host, port);
process.env.host = host;
// process 不能存储JSON格式的数据
process.env.port = port;
global.userInfo = {
name: 'huangbiao',
age:
}
app.SERVER_INFO = {
name: 'zhangsan',
age:
}
});
需要使用app.use('/api', apiRouterIndex);这种方式配置URL请求的范围
const express = require('express');
const router = express.Router();
const tokenConfig = require('../common/config/tokenConfig');
// 处理token 的同一工具
const jwtUtils = require('../common/util/jwtUtils');
const apiService = require('./service/apiService.js');
var jwt= require('jsonwebtoken'); // 使用jwt签名
var fs = require('fs');
// 用来验证token,作为后台管理的拦截器
router.use(function (req, response, next) {
var isToken = jwtUtils.checkTokenByRequest(req);
// 如果获取的token 不合格,则给出提示信息
if (!isToken) {
response.status().json({
state: ,
message: 'token数据不正确'
});
return false;
}
next();
});
// 查询所有的标签 接口
router.get('/tags/list', function(req, res, next) {
// 创建tag标签
apiService.queryTagList({},function (err, results, fields) {
res.json({
data: results
});
});
});
// 删除标签 接口
router.post('/tags/delete', function(req, res, next) {
console.log(req.body);
var id = req.body.id;
// 删除tag标签
apiService.deleteTagById(id, function (err, result) {
res.json({
status: true
});
});
});
module.exports = router;
在所有URL前面添加一个router.use(function (req, response, next) {next();});方法,用来验证token是否正确,这个拦截器只是针对http://localhost:3000/api打头的请求
// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 创建 token 类
class Jwt {
constructor(data) {
this.data = data;
}
// 检查token
static checkTokenByRequest (requestObj) {
// 拿取token 数据 按照自己传递方式写
var tokenOrigin = requestObj.headers['Authorization'] || requestObj.headers['authorization'];
if (tokenOrigin === '' || tokenOrigin === undefined || tokenOrigin === null ) {
console.log('的值不能为空')
return false;
}
// 获取服务器返回的token值
var tokenStr = tokenOrigin.split(' ')[];
if (tokenStr === '' || tokenStr === undefined || tokenStr === null ) {
console.log('token 格式不正确')
return false;
}
return tokenStr;
}
// 从header请求中获取token
static getTokenFromHeader (requestObj) {
var tokenStr = this.checkTokenByRequest(requestObj);
if (tokenStr) {
return tokenStr;
} else {
return null;
}
}
} module.exports = Jwt;
https://www.jianshu.com/p/a248b146c55a http-proxy-middleware
https://blog.csdn.net/xmloveth/article/details/56847456 npm模块之http-proxy-middleware使用教程(译
https://www.jianshu.com/p/47c9e65f5a04 Vue项目中使用express实现反向代理
https://blog.csdn.net/hbiao68/article/details/85769755 express指定返回的拦截器处理
https://www.jianshu.com/p/9401a099c032?utm_source=oschina-app node.js之express模块
http-proxy-middleware及express实现反向代理的更多相关文章
- Forward Proxy & Reverse Proxy | 正向代理 和 反向代理
对请求和响应内容不做修改的转发的服务器,被称为代理服务器.代理服务器分为两种类型:正向代理 和 反向代理. 正向代理:面向互联网,从更广范围获取信息的代理. 反向代理:面向内部,一般用于某企业的网站的 ...
- 反向代理(Reverse Proxy)
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- golang http proxy反向代理
本文介绍golang中如何进行反向代理. 下面例子中, proxy server接收client 的 http request,转发给true server,并把 true server的返回结果再发 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- Nginx应用-Location路由反向代理及重写策略 请求转发-URL匹配规则 NGINX Reverse Proxy
NGINX Docs | NGINX Reverse Proxy https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/ ...
- 用express框架实现反向代理
目前很多公司开发都是前后台分离开发,于是我用node起了一个服务,用node中的express框架实现了反向代理.(通俗易懂的讲就是我在我的电脑访问不到后台同事的电脑接口,这样做以后就可以在我本地访问 ...
- 反向代理Reverse proxy
https://www.zhihu.com/question/24723688/answer/160252724 反向代理在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy
https://zh.wikipedia.org/wiki/反向代理 反向代理在计算机网络中是代理服务器的一种.服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后 ...
- Docker Nginx-Proxy 容器Nginx Proxy反向代理
Docker Nginx-Proxy 容器Nginx Proxy反向代理 简单介绍 Docker容器的自动Nginx反向代理 dockerhub地址 https://hub.docker.co ...
随机推荐
- openwrt双机热备
转自:https://oldwiki.archive.openwrt.org/doc/recipes/high-availability 先记号一下,有空再仔细研究. ---------------- ...
- ElasticSearch 连载二 中文分词
ElasticSearch 连载二 中文分词 上一章ElasticSearch 连载一 基础入门 对Elastic的概念.安装以及基础操作进行了介绍. 那是不是有童鞋会有以下几个问题呢? 什么是中文分 ...
- css全局定位内容图片自动居中
最近在做一个资讯站点时候,因为采集的数据,图片不居中,导致界面很不美观,所以需要全局定义下图片输出时候进行居中. .content img { max-width:800px;_width:expre ...
- Selenium常用API的使用java语言之12-定位一组元素
在第(五)节我们已经学习了8种定位方法, 那8种定位方法是针对单个元素定位的, WebDriver还提供了另外8种用于定位一组元素的方法. import org.openqa.selenium.By; ...
- 是什么是FBC CBV
- FBV url - 函数 - CBV url - view
- 学习。NET三周心得
目前为止 学习.NET已经快一个月了,有刚开始的不懂,到中途懵懂.再到现在的简懂 ,感觉自己迷了好多天,学习程序员跟学其他的程序还不同,其他的有固定格式,而.NET则固定很少 ,一直在用方法连接前后台 ...
- 对url路径中的参数进行加密--Java
需求: 后台对一些比较敏感的参数进行数据加密,然后在传送到前端.当前端跳转到后台时,再由后台对其进行解密. 参考 针对url参数的加密解密算法(java版) 修改:对中间的js页面加密代码改写为jav ...
- TensorFlow(七):tensorboard网络执行
# MNIST数据集 手写数字 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # ...
- ros平台下python脚本控制机械臂运动
在使用moveit_setup_assistant生成机械臂的配置文件后可以使用roslaunch demo.launch启动demo,在rviz中可以通过拖动机械臂进行运动学正逆解/轨迹规划等仿真运 ...
- P1025 数的划分——简单题刷傻系列
P1025 数的划分 学傻了,学傻了,什么dp搜索什么啊: #include<cstdio> #include<cstring> #include<algorithm&g ...