问题描述:
token未使用:本项目前后分离,后台跨域使用@CrossOrigin解决,至此所有跨域请求都没问题。
加入token实现思路:当对接登录功能的时候,使用jwt来实现的,第一次请求登录接口不拦截,然后jwt生成的token需要放入response的header中,前台获取header中的token存起来,第二次请求把此token取出来放入request的header中,后台用拦截器来拦截演示是否过期,如果过期拦截返回信息告知前台,否则放行并把新的token放入response的header中给前天。之后请求重复第二次请求。
加入token出现问题:加入token后发现后台不能把token放入response的header中,于是放token之前先加上response.setHeader("Access-Control-Expose-Headers","token");这句话就可以向response的header中放入token,前台可以取到token。
但是:
当第二次请求时,token死活放不到request的header中,如下图:
奇怪的是用postman请求时,添加token就可以在后台获取到token,如下图:
解决方案:
增加过滤器,允许header中存放token。
至此:ajax请求时,hader中可以存放token
参考文章:https://blog.csdn.net/charleslei/article/details/51906635 各个属性设置说明
https://blog.csdn.net/No_be_IT_movers/article/details/81003907 解决跨域问题
https://my.oschina.net/wangnian/blog/689020 SpringMvc解决跨域
总结:浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求(比如异步请求GET, POST, PUT, DELETE, OPTIONS等等),所以浏览器会向所请求的服务器发起两次请求,第一次是浏览器使用OPTIONS方法发起一个预检请求,第二次才是真正的异步请求,第一次的预检请求获知服务器是否允许该跨域请求:如果允许,才发起第二次真实的请求;如果不允许,则拦截第二次请求。就是在预检请求的结果中开放前台向header中增加token值,第二次真实请求就可以附带上token。
有两个不明白的地方:
1.后台请求中明明已经使用@CrossOrigin了,为啥还会出现跨域问题,及把过滤器中resp.addHeader("Access-Control-Allow-Origin","*");这句话去掉,会出现跨域问题。(@CrossOrigin注解中可以设置跨域参数,默认情况下不允许向header中添加参数,配置过滤器中的response后,@CrossOrigin不起作用)
2.不设置过滤器时,postman请求中加入token后台照样可以获取,(postman不存在跨域请求)