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

先简单介绍一下跨域是什么?
在开发中前后端并不在一个端口下,必然涉及到跨域:
XMLHttpRequest会遵守同源策略(same-origin policy). 也即脚本只能访问相同协议/相同主机名/相同端口的资源, 如果要突破这个限制, 那就是所谓的跨域, 此时需要遵守CORS(Cross-Origin Resource Sharing)机制。
解决跨域问题的方法网上有很多,这里就不给方法了。

关键的问题来了,为什么shiro权限控制管理获取不到header中的token值。我们都知道shiro权限控制管理一般都是通过判断请求头中的token来进行认证授权的。
然而在前后端分离项目中,由于跨域,会导致复杂请求,即会发送预检请求(preflighted request),这样会导致在GET/POST等请求之前会先发一个OPTIONS请求,但OPTIONS请求并不带shiro的’Authorization’字段(shiro的Session),即OPTIONS请求不能通过shiro验证,会返回未认证的信息。
当后台没有接收到token值时,开始认为可能是token没有放入headers中,然后当我们将请求的shiro拦截打开后,会发现后台会获取到token值。所以可以判断token值已经放入请求头中。

解决方法:给shiro增加一个过滤器,过滤OPTIONS请求
public class xxx extends FormAuthenticationFilter {
@Override
public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
//Always return true if the request’s method is OPTIONS
if (request instanceof HttpServletRequest) {
if (((HttpServletRequest) request).getMethod().toUpperCase().equals(“OPTIONS”)) {
return true;
}
}
return false;
}
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值