我有很多这样的“控制器”:
app.get('/',function(req,res){
var stuff = { 'title': 'blah' };
res.render('mytemplate',stuff);
});
注意res.render?我想将此标题添加到我创建的每个响应标头中:
X-XSS-Protection: 0
如何自动添加该响应标头?
答案 0 :(得分:69)
您可能希望将app.use与您自己的中间件一起使用:
app.use(function(req, res, next) {
res.header('X-XSS-Protection', 0);
next();
});
答案 1 :(得分:65)
// global controller
app.get('/*',function(req,res,next){
res.header('X-XSS-Protection' , 0 );
next(); // http://expressjs.com/guide.html#passing-route control
});
确保这是您添加的第一个控制器,订单很重要。
答案 2 :(得分:10)
对于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);
});
});
% npm install --save-dev mocha hippie
答案 3 :(得分:7)
您可以像这样创建自己的中间件方法:
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);
});
应该有用。
答案 4 :(得分:3)
我发现在路由中间件期间注入默认标头的另一个好地方。这样,路由器实例控制的所有路由都将接收标头。
例如:
//...
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
// ...
});
答案 5 :(得分:1)
我想指出这些答案都没有真正回答这个问题;这个问题具体涉及渲染回应;例如对于像这样的应用程序:
const router = require('express').Router();
router.use('/test.json', (req, res) => res.json({ test: 'hi' });
router.use('/test.html', (req, res) => res.render('test'));
目前尚不清楚如何向HTML回复添加标题(例如,CSP标题,这可能非常详细)仅。 Express并没有特别注意这一点。目前唯一的选择是组织您的代码,以便您不必,例如
app.use(jsonRouter);
app.use(htmlRouter);
...允许您像其他一些答案一样建议,并添加通用中间件来设置标题。
答案 6 :(得分:0)
使用middleware ...
app.use(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(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)
花点时间找出答案。我没有在任何地方看到它,因此添加了它以补充先前的答案。