You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:17