table.set()仅设全局默认headers且需在render前调用,无法区分不同表格;差异化配置必须依赖render中headers参数,同名header以render配置优先。
table.set() 只能设全局默认 Header,不能区分不同表格
如果你只是想让所有 table.render() 请求都带一个固定 header(比如 x-source: admin),table.set() 是最轻量的方式。但它只能设一次,后调用会覆盖前一次;而且它不支持按表格差异化配置。
常见错误是:在多个 table.render() 前反复调用 table.set(),结果只有最后一个生效。真要每个表格带不同 token 或来源标识,必须放弃纯 table.set() 方案。
- 必须在
table.render()之前调用,否则无效 - 只影响
table模块发起的请求,不影响form.submit()或手动$.get() - 设的是默认值,后续
render中同名 Header 会覆盖它(不是合并)
render 里的 headers 参数才是多表格差异化的正确姿势
table.render() 的 headers 字段支持对象写法,且会和 table.set() 合并(同名 key 以 render 里的为准)。这是唯一能给单个表格单独配 Header 的方式。
示例:一个表格用 localStorage token,另一个用固定测试 token,互不干扰:
table.render({
elem: '#userTable',
url: '/api/users',
headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
});
table.render({
elem: '#logTable',
url: '/api/logs',
headers: { 'X-Env': 'test', 'Authorization': 'Bearer test123' }
});
- GET 请求下
headers一定生效;POST 时要注意contentType是否匹配(见下一条) - 如果同时用了
table.set({ headers: {...} }),两者会浅合并,render里同 key 优先生效 - 别把敏感字段(如 token)硬编码在 JS 里,优先读取
localStorage或sessionStorage
POST 请求时 headers 丢失?大概率是 contentType 不匹配
Layui 默认把 where 参数拼成 query string 发送,哪怕你写了 method: 'post' —— 这时 jQuery 实际发的是 GET,headers 看似写了,但根本没走 POST 流程。
更隐蔽的问题是:你强制设了 method: 'post',但没设 contentType: 'application/json',jQuery 默认用 application/x-www-form-urlencoded 编码数据,而很多后端 JWT 校验逻辑只检查 application/json 请求头下的 Authorization 字段。
- 解决方法一(推荐):禁用
where,改用request返回 JSON 字符串,并显式设contentType: 'application/json' - 解决方法二:保持
where,但接受它是 GET 行为 —— 此时headers仍有效,但不适合传敏感参数 - 手动
JSON.stringify(data)必须配合contentType,否则后端收不到原始 body
动态注入 token 的稳定方案:用 $.ajaxPrefilter
$.ajaxSetup() 在 Layui 1.x 中经常失效,因为模块加载顺序或内部绕过 jQuery 流程。真正可靠的是 $.ajaxPrefilter() —— 它在每次请求发出前触发,可读取 token 并动态塞进 headers。
关键点是必须过滤域名,避免把 token 错带到 CDN 或统计脚本:
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
if (options.url.indexOf('/api/') === 0) {
const token = localStorage.getItem('access_token');
if (token) {
options.headers = options.headers || {};
options.headers.Authorization = 'Bearer ' + token;
}
}
});
- 这个钩子对
table、form、手动$.ajax全部生效 - 它不处理响应,401 拦截得另配
$.ajaxComplete(),同样要加 URL 过滤 - 不要在
beforeSend里重复做这事 ——beforeSend是 per-request 的,维护成本高且易漏
contentType 和参数提交方式。漏掉任一环,Headers 就静默失效。











