如何让Node.js控制器识别请求来源(页面/URL/用户等)?
如何让Node.js控制器识别请求来源?
当然有办法啦!针对你提到的多页面/站点调用Node.js控制器的场景,我整理了几个实用的方案,帮你的后端精准识别请求来源——不管是页面、URL还是发起请求的用户:
1. 自定义请求头传递来源标识
这是最灵活可控的方式,你可以在前端发起请求时手动添加一个自定义请求头,明确标记请求来自哪个页面或站点。
修改你的前端示例代码:
$http({ method: 'POST', url: globalSetting.serverURL + 'getMailTemplate', headers: { 'Content-Type': 'application/json', // 自定义头,按需标记来源页面/站点 'X-Request-Source': 'booking-detail-page' }, data: { users: $scope.vm.user, booking: $scope.vm.booking } }).then((response) => { // 处理逻辑 })
然后在Node.js控制器(以Express为例)里,通过req.headers获取这个自定义头:
app.post('/getMailTemplate', (req, res) => { const requestSource = req.headers['x-request-source']; console.log('请求来自:', requestSource); // 输出 booking-detail-page // 后续业务处理逻辑 });
这个方法完全由你控制,不受浏览器设置影响,适合精准标记来源。
2. 利用浏览器自带的Referer请求头
大多数浏览器在发起请求时,会自动带上Referer头,这个头包含了发起请求的页面URL。你可以直接在Node.js里读取这个值:
const url = require('url'); app.post('/getMailTemplate', (req, res) => { const refererUrl = req.headers.referer; if (refererUrl) { const parsedUrl = url.parse(refererUrl); console.log('请求来源页面路径:', parsedUrl.pathname); } else { console.log('无法获取Referer,可能被浏览器禁用或请求为直接发起'); } // 后续业务处理逻辑 });
注意:Referer头是可选的,用户可通过浏览器设置禁用,跨域场景下也可能不传递,所以只能作为辅助手段,不能完全依赖。
3. 识别发起请求的用户
要识别用户,常用两种方案:
方案A:Session机制(适合有状态架构)
如果你的应用使用了Session(比如Express的express-session中间件),用户登录后Session会存储用户标识,直接从req.session获取即可:
app.post('/getMailTemplate', (req, res) => { const currentUser = req.session.user; // 假设登录时已将用户信息存入session if (currentUser) { console.log('请求用户ID:', currentUser.id); console.log('请求用户名:', currentUser.username); } // 后续业务处理逻辑 });
方案B:JWT令牌(适合无状态前后端分离架构)
前端在请求头里带上JWT令牌(通常存在Authorization头),后端解析令牌获取用户信息:
前端修改请求头:
$http({ method: 'POST', url: globalSetting.serverURL + 'getMailTemplate', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + localStorage.getItem('jwtToken') }, data: { users: $scope.vm.user, booking: $scope.vm.booking } }).then((response) => { // 处理逻辑 })
后端解析JWT(使用jsonwebtoken库):
const jwt = require('jsonwebtoken'); app.post('/getMailTemplate', (req, res) => { const authHeader = req.headers.authorization; if (authHeader) { const token = authHeader.split(' ')[1]; jwt.verify(token, '你的密钥', (err, decoded) => { if (!err) { console.log('请求用户信息:', decoded.user); } }); } // 后续业务处理逻辑 });
4. 在请求体/URL参数里携带来源信息
如果你不想用请求头,也可以直接在请求的data里添加来源字段:
前端代码:
$http({ method: 'POST', url: globalSetting.serverURL + 'getMailTemplate', headers: { 'Content-Type': 'application/json' }, data: { users: $scope.vm.user, booking: $scope.vm.booking, source: 'mail-template-request' // 标记请求来源 } }).then((response) => { // 处理逻辑 })
后端从req.body获取:
app.post('/getMailTemplate', (req, res) => { const requestSource = req.body.source; console.log('请求来源:', requestSource); // 后续业务处理逻辑 });
这个方式直观简单,适合小型项目或简单场景。
内容的提问来源于stack exchange,提问作者torbenrudgaard
相关产品推荐
相关产品推荐

