
一直做安卓开发,趁着疫情失业,就想着更新一下技术栈,就学了一下 Springboot 和 Vue ,顺便写了个页面,然后在 Android WebView 上加载。
项目后端是 Springboot 写的
前端是 Vue2
前端使用 axios 发送 et 请求:
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" } 是无效的
有人遇到过这样的状况吗?该怎么解决呀
1 chnwillliu 2022-05-25 05:59:36 +08:00 via Android 抓个包,看下是不是有这个请求头,可能是 webview 层拦截了。 |
2 chnwillliu 2022-05-25 06:07:08 +08:00 via Android 哦,这个是你自己的 webview 对吧,那抓包看下 cors preflight 请求。因为你的 Token 是自定义 header 所以这个 get 就变成了非简单请求, 服务器对 preflight 要响应 access-control-allow-headers 允许你这个 header. |
3 Removable 2022-05-25 08:43:45 +08:00 @chnwillliu #2 估计就是这个原因 |
4 lixyz OP @chnwillliu @Removable 感谢解答。。。 今天找了一天原因,又是抓包又是重写的 最后发现,因为我是双向认证,所以重写了 webview 的 CLIENT ,然后在 client 中过滤掉了添加的 Header 。。。 |
5 yumobs 2022-05-26 15:05:02 +08:00 你就不能看看 F12 审查元素,看看请求带了 Token 了吗? 带了就是后端问题,没带就前端问题。 |