在 Node.js/Express 中,如何自动将此标头添加到每个“渲染”响应中?

Posted

技术标签:

【中文标题】在 Node.js/Express 中,如何自动将此标头添加到每个“渲染”响应中?【英文标题】:In Node.js/Express, how do I automatically add this header to every "render" response? 【发布时间】:2011-10-03 10:04:38 【问题描述】:

我有很多这样的“控制器”:

app.get('/',function(req,res)
    var stuff =  'title': 'blah' ;
    res.render('mytemplate',stuff);
);    

注意 res.render?我想将此标头添加到我制作的每个响应标头中:

X-XSS-Protection: 0

如何自动添加响应头?

【问题讨论】:

【参考方案1】:

您可能希望将app.use 与您自己的中间件一起使用:

app.use(function(req, res, next) 
    res.header('X-XSS-Protection', 0);
    next();
);

【讨论】:

这是大家现在应该用的。 是的,这是 Express 4 中的方法。始终使用app.use 比例外的答案好多了。 注意res.set is an alias 是这里使用的方法 -- res.header -- 是别名的函数【参考方案2】:
// global controller
app.get('/*',function(req,res,next)
    res.header('X-XSS-Protection' , 0 );
    next(); // http://expressjs.com/guide.html#passing-route control
);

只要确保这是您添加的第一个控制器,顺序很重要。

【讨论】:

啊,这个好像更好 如果你真的想为所有调用添加 header 参数,这比将中间件调用添加到每个路由要短得多。 因此,通过将其添加为第一个控制器,我所有其他控制器的响应中都会包含该标头? Afaik 是的,因此可以通过多个控制器路由响应。 这已经过时了,见下文。【参考方案3】:

对于express 4.x,惯用方式如下:

实施

// no mount path; executed for every request.
app.use(function (req, res, next) 
  res.set('X-XSS-Protection', 0);
  next();
);

测试

describe('Response Headers', function () 
  it('responds with header X-XSS-Protection: 0', function (done) 
    hippie(app)
    .get('/any/route/you/can/think/of')
    .expectHeader('X-XSS-Protection', 0)
    .end(done);
  );
);

Dev 依赖项(用于测试工作)

% npm install --save-dev mocha hippie

相关文档

Application Level Middleware res.set

【讨论】:

【参考方案4】:

您可以像这样创建自己的中间件方法:

addToHeader = function (req, res, next) 
  console.log("add to header called ... " + req.url);
  res.header('X-XSS-Protection', '0');
  next();

然后像这样改变你的路线:

app.get('/', addToHeader, function(req,res)
  var stuff =  'title': 'blah' ;
  res.render('mytemplate',stuff);
);

应该可以。

【讨论】:

【参考方案5】:

我发现注入默认标头的另一个好地方是在路由中间件期间。这样,路由器实例控制的所有路由都将收到标头。

例如:

//...
var router = express.Router();

// middleware for all routes
router.use(function(req, res, next) 
  // inject default headers
  res.header('cache-control', 'private, max-age=0');
  res.header('expires', new Date(Date.now()).toUTCString());
  next();
);

// all routes below will now inherit 
// the middleware's default headers
router.get('/users', function(req, res)
   // I will return the user list, with default headers
   // ...
);

【讨论】:

【参考方案6】:

使用middleware...

app.use(function (req, res, next) 
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next()
)

但请确保您您的 API 方法之前使用它。像这样:

const app = express()

// middleware
app.use(function (req, res, next) 
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next()
)

// api
app.get('/user', (req, res, next) => 
  service.doSomething
    .then(data => res.send(data))
    .catch(next)
)

app.use(handleError)

我花了一段时间才弄明白。我没有在任何地方看到它,所以添加它以补充以前的答案。

【讨论】:

你能看看这个吗:***.com/questions/69409586/…【参考方案7】:

我想指出,这些答案都没有真正回答这个问题;该问题具体与呈现响应有关;例如对于这样的应用:

const router = require('express').Router();
router.use('/test.json', (req, res) => res.json( test: 'hi' );
router.use('/test.html', (req, res) => res.render('test'));

不清楚如何将标头(例如 CSP 标头,可能非常冗长)添加到您的 HTML 响应中。 Express 没有专门做这件事的钩子。目前唯一的选择是组织你的代码,这样你就不必这样做了,例如

app.use(jsonRouter);
app.use(htmlRouter);

...它允许您按照其他一些答案的建议进行操作,并添加通用中间件来设置标题。

【讨论】:

我认为这个答案是我们都在寻找的答案:***.com/a/48448925/6814172

以上是关于在 Node.js/Express 中,如何自动将此标头添加到每个“渲染”响应中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?

在 Node.js/Express.js 中,如何将 JSON 对象从服务器传输到客户端?

如何使用 node.js、Express 和 knox 将文件从浏览器上传到 Amazon S3? [关闭]

使用 node.js/express 自动 HTTPS 连接/重定向

Node JS+Express:如何在 HTML(EJS) 中定义和使用 MySQL 数据?

Node.JS、Express 和 MongoDB :: 多个集合