前后端分离项目,后端 Springboot 获取不到前端 axios 传递的 header 是怎么回事儿?

2022-05-24 23:55:29 +08:00
 lixyz

一直做安卓开发,趁着疫情失业,就想着更新一下技术栈,就学了一下 Springboot 和 Vue ,顺便写了个页面,然后在 Android WebView 上加载。

项目后端是 Springboot 写的

前端是 Vue2

前端使用 axios 发送 get 请求:

axios.get('https://www.xxx.com/getXXX?a=1&b=2&c=3', {
        headers: {
          "Token": "xxxxxxxxx"
        }
      }).then((res) => {
        ...
      })

后端 Springboot Controller 是这样写的:

    @GetMapping("/getXXX")
    public Result getXXX(HttpServletRequest request, @RequestParam("a") int a, @RequestParam("b") int b, @RequestParam("c") int c) {
        String userId = request.getHeader("Token");
        if (userId == null) {
            return new Result(false, "未登录操作", null, null);
        } else {
            return service.getPlans(userId, year, month, day);
        }
    }

涉及到跨域问题,在 Controller 上加了 @CrossOrigin 注解解决了。

整个过程在浏览器调试的时候是正常的,但是将 Vue 项目打包上传到服务器中,使用 Android webview 来访问的时候,却提示“未登录操作”,也就意味着 request.getHeader("Token") 为 null

我遍历了下 Springboot 接受到的 Header ,只有:

user-agent
host
connection
accept-encoding

也就是说,webview 下

        headers: {
          "Token": "xxxxxxxxx"
        }

是无效的

有人遇到过这样的状况吗?该怎么解决呀

1570 次点击
所在节点    前端开发
5 条回复
chnwillliu
2022-05-25 05:59:36 +08:00
抓个包,看下是不是有这个请求头,可能是 webview 层拦截了。
chnwillliu
2022-05-25 06:07:08 +08:00
哦,这个是你自己的 webview 对吧,那抓包看下 cors preflight 请求。因为你的 Token 是自定义 header 所以这个 get 就变成了非简单请求, 服务器对 preflight 要响应 access-control-allow-headers 允许你这个 header.
Removable
2022-05-25 08:43:45 +08:00
@chnwillliu #2 估计就是这个原因
lixyz
2022-05-25 16:07:37 +08:00
@chnwillliu @Removable 感谢解答。。。
今天找了一天原因,又是抓包又是重写的
最后发现,因为我是双向认证,所以重写了 webview 的 CLIENT ,然后在 client 中过滤掉了添加的 Header 。。。
yumobs
2022-05-26 15:05:02 +08:00
你就不能看看 F12 审查元素,看看请求带了 Token 了吗? 带了就是后端问题,没带就前端问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855091

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX