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 ...
随机推荐
- [Abp vNext微服务实践] - 框架分析
一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...
- Helix QAC — 软件静态测试工具
Helix QAC 是Perforce 公司(原PRQA 公司)产品,主要用于C/C++ 代码的完全自动化静态分析工作,可以提供编码规则检查.代码质量度量.软件结构分析.测试结果管理等功能.Helix ...
- UML之九种图
UML说是九种图吧!其实是众说纷纭,不管有几种图,我们只要能够很好的运用这几张图就好,主要有用例图.类图.对象图.状态图.活动图.序列图.协作图.构件图和部署图,至于包图是否属于这九种图,我也理不清楚 ...
- Java8新特性--Optional
Java 8引入了一个新的Optional类.Optional类的Javadoc描述如下: 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会 ...
- 7月新的开始 - Axure学习05 - 元件库的创建
元件库的创建 元件库的创建.载入.编辑和删除等操作 元件库的后缀名名:.rplib 学习结果: 实现iPhone6的原型图 分辨率是 1080*1920,现在我们按比例缩小去实现(360*640)
- 洛谷P2051 中国象棋【dp】
题目:https://www.luogu.org/problemnew/show/P2051 题意:n*m的格子里放炮,使他们不能互相攻击. 如果两个炮在同一行同一列并且中间还有一个棋子的话就可以攻击 ...
- Mongodb 查询优化(慢查询Profiling)
开启慢查询Profiling Profiling级别说明 0:关闭,不收集任何数据. 1:收集慢查询数据,默认是100毫秒. 2:收集所有数据 1.通过修改配置文件开启Profiling 修改启动mo ...
- 三十四.MySQL主从同步 、主从同步模式
mysql51:192.168.4.51 主 mysql52:192.168.4.52 从 mysql50:192.168.4.50 客户机 1.MySQL一主一从 1.1 51,52 安装m ...
- luogu P2345 奶牛集会
二次联通门 : luogu P2345 奶牛集会 /* luogu P2345 奶牛集会 权值线段树 以坐标为下标, 坐标为值建立线段树 对奶牛按听力由小到大排序 对于要查的牛 每次第i次放入奶牛起作 ...
- 安装less/sass
安装sass npm i node-sass 安装wepy-compiler-sass插件 npm install wepy-compiler-sass --save-dev 在我的项目中使用才有用.