shiro为何获取不到请求头中的token值

现在的项目一般都是前后端分离的项目,前后端分离就必然涉及到跨域问题。先简单介绍一下什么是跨域。

XMLHttpRequest会遵守同源策略(same-origin policy)。也就是只能访问相同协议、相同主机名、相同端口的资源,如果要突破这个限制,即为跨域。使用跨域需要遵守CORS。有了跨域就有了今天这个问题。我们知道使用shiro进行权限控制一般是通过将token放在header中(这样比较简单),shiro通过判断token是否有效来进行认证授权。

在前后端分离项目中,由于跨域,会导致复杂请求,机会发送预检请求(preflighted request),这样在Get/Post等请求之前会发送一个OPTIONS请求,就下面这货。

OPTIONS请求

本来我的逻辑是在下面代码这来获取token

但是却获取不到,因为在浏览器发送OPTIONS请求的时候,不会携带数据,也就是我们的token信息没在此header中,即所有的OPTIONS请求不能通过shiro验证,会返回未认证信息。

当后台没有接收到token值,刚开始认为可能是token没有放入header中,然后当我把拦截关闭之后后台又取得到token了,所以可以断定token已经放入请求头中了。



解决方法:给shiro增加一个过滤器,过滤OPTIONS请求,如果发现是OPTIONS请求和又token的请求就放行。


MyShiroFilter


ShiroConfig


ShiroConfig

之后在进行访问,请求成功


请求成功


shiro取到token

后台也取到了token了。

士不可以不弘毅,在通往全栈攻城狮的道路上慢慢前进。

你可能感兴趣的:(shiro为何获取不到请求头中的token值)