您现在的位置是:焦点 >>正文

C前端模拟post请求增加header参数

焦点3668人已围观

简介 C前端模拟post请求增加header参数 浏览器里点开F12,Network面板里那条红色的POST请求,十有八九是跨域被拦了。前端模拟POST请求加header参数,核心就一句话:先过预检,再谈 ...

C前端模拟post请求增加header参数

浏览器里点开F12,前t请求增Network面板里那条红色的端模POST请求,十有八九是前t请求增跨域被拦了。前端模拟POST请求加header参数,端模核心就一句话:先过预检,前t请求增再谈业务。端模预检不过,前t请求增后面全是端模白搭。

我见过太多人栽在Authorization上。前t请求增后端要token,端模前端直接fetch一写:

fetch('/api/data',前t请求增 {  method: 'POST', headers: {  'Authorization': 'Bearer ' + token }, body: JSON.stringify({ name: 'test'}) })

然后控制台报错,红彤彤一片。端模问题不在你代码,前t请求增是端模浏览器先发了个OPTIONS请求试探,后端没搭理,前t请求增直接404或500,浏览器就判定这请求不安全,给拦了。你加的自定义header,比如X-Requested-With或者X-Custom-Token,都属于非简单请求,必须服务端配合。

那怎么模拟?分两种情况。

第一种,后端你能改。那最干净。后端CORS配置里加上允许的header,比如用Node的cors中间件:

app.use(cors({  allowedHeaders: ['Authorization', 'Content-Type', 'X-Custom-Token'] }))

前端照常发,浏览器预检通过,请求正常走。这种情况没啥好说的,纯粹后端配置问题。

第二种,后端你碰不到,或者只是本地调试。这时候别硬刚浏览器。用代理工具,比如Charles、Fiddler,或者前端脚手架里的devServer代理。拿webpack举例,devServer里配个proxy:

devServer: {  proxy: {  '/api': {  target: 'http://real-server.com', changeOrigin: true, onProxyReq: (proxyReq, req, res) => {  proxyReq.setHeader('Authorization', 'Bearer ' + req.headers['x-temp-token']) } } } }

这样浏览器发的请求不带自定义header,代理层偷偷加上去,绕过跨域限制。实际开发里我常用这招,省得跟后端扯皮。

但有个坑,onProxyReq里拿到的req.headers是原始请求的,如果你前端本来就没传那个token,你从哪拿?所以前端得先把token放在一个浏览器允许的header里,比如X-Temp-Token,代理层读出来再转成Authorization。麻烦是麻烦点,但能跑通。

还有一种野路子,直接禁用浏览器安全策略。Chrome启动加参数--disable-web-security --user-data-dir=某个临时目录。这招只适合本地快速验证,别拿它糊弄测试环境。我见过有人把这参数写进启动脚本,后来忘了删,整个团队都在用禁了安全策略的浏览器测东西,后端接口裸奔了俩月。别学。

说回header本身。模拟POST请求加header,最常见的场景是加Content-Type。默认的text/plain;charset=UTF-8后端解析不了,你得显式设成application/json。但注意,一旦你设了application/json,这请求就变成非简单请求了,预检又来了。所以很多老手干脆用text/plain传JSON字符串,后端自己解析。丑是丑,但省了预检的麻烦。

我自己写调试工具时,更倾向用axios。它底层是XHR,但封装了拦截器。你可以在请求拦截器里统一加header:

axios.interceptors.request.use(config => {  config.headers['X-Debug-Token'] = localStorage.getItem('debug-token') return config })

但axios在浏览器里照样受CORS限制,拦截器只是方便你加,能不能发出去还得看预检。所以别把axios当万能药。

最后提一嘴,模拟POST请求加header,别忘了一个细节:header参数名别用下划线。有些网关或者代理服务器会吞掉带下划线的header,比如X_User_ID,折腾半天以为是跨域问题,结果是Nginx默认忽略带下划线的header。改成X-User-Id,立马通了。这坑我踩过一次,排查了三个小时,最后在Nginx配置里加了underscores_in_headers on;才解决。后来我写代码,凡自定义header一律用连字符,绝不碰下划线。

模拟POST请求加header参数,说到底就是跟浏览器的安全策略博弈。要么让后端放行,要么自己代理绕行,要么干脆走非浏览器环境。Node里用axios或者node-fetch,啥header都能加,没有CORS的破事。但前端模拟,就得认命,按规矩来。

Tags:

上一篇:盗版飞卢最全的网站

下一篇:盗取网站

相关文章

  • iis web core 0x80070002

    焦点

    0x80070002,这个错误码翻译成人话就是“系统找不到指定的文件”。但IIS Web Core报这个错,十有八九不是文件真丢了,而是配置和现实对不上号。 我见过最典型的场景:运维把站点文件从D盘挪 ...

    【焦点】

    阅读更多
  • 电渗析法淡化海水原理

    焦点

    电渗析法淡化海水,说白了就是给海水通上电,让盐分自己“排队走人”。这技术听着玄乎,原理却朴素得像个物理课实验——离子在电场里会定向迁移,阳离子往负极跑,阴离子往正极跑。你要是把一堆阴阳离子交换膜夹在电 ...

    【焦点】

    阅读更多
  • 红河网络营销推广SEO优化哪家做的好

    焦点

    红河本地的网络公司我接触过七八家,真正能把SEO做出效果的,掰着手指头数也就两三家。这个结论不是看他们官网的案例截图得出的,而是我实地蹲过他们办公室,看过后台数据才敢说。 红河州的企业有个通病,老板们 ...

    【焦点】

    阅读更多


友情链接