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;
}
}

你可能感兴趣的:(token)