安全验证中token如何放在请求头中传输的解决方法
前几天做flutter项目的时候网络请求都没有问题,封装网络请求什么都ok,都是用的开源的api,想着用到实战中吧,就把现有的项目直接调用试试,发现一直都是token失效,获取不到最新的token,debug一圈之后发现获取token的请求,返回提的header中的请求头和传递过去的基本上一样,后台返回来的token没有获取到,或者说根本就没有这个字段,一直在考虑是哪里封装的有问题?毕竟是新的东西刚接触不就嘛,一直找问题,扒博客,发现一个词 “跨域”,就开始找扒拉,发现有一篇文章有提到摘抄记录整理一下。
问题所在:在网上扒了半天博客,发现问题出在后端,没错这是一个后端问题。因为跨域,后台就不会接收一切非官方的请求头,而前端也无法获取一切非官方的响应头。解决办法很简单,后台只需要对请求头和响应头的自定义字段进行声明就行了。
代码:后台代码其实是不一样的,我们后台使用了spring boot框架,所以是这种写法。
corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
corsConfiguration.addAllowedHeader("token"); // 2 设置访问源请求头 corsConfiguration.addAllowedMethod("POST,GET"); // 3 设置访问源请求方法
corsConfiguration.setMaxAge(1800000L);//间隔30分钟验证一次是否允许跨域
response.setHeader("Access-Control-Expose-Headers","Cache-Control,Content-Type,Expires,Pragma,Content-Language,Last-Modified,token");
response.setHeader("token", JwtToken.createToken(user.getId())); //设置响应头
注意第二段代码标红的那句,网上很多教程都写的是access-control-allow-headers,这其实是错的。
这个问题虽然是一个后台问题,但是在前后端交互过程中发现的,并且我一度认为是我的问题。所以把它记录了下来,也算是见证我的成长吧。
发不出来让看到的朋友们,尤其是没有后台基础或者flutter刚接触的人提个醒,不需要纠结,也可以节省不少时间