我遇到的问题与类型消息有关:
OPTIONS http://localhost:8080
XMLHttpRequest cannot load http://localhost:8080/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 401.
所以基本上这是我们的Angular JS 1.4.3前端在实际请求之前向服务器发送OPTIONS
请求的问题。出现问题,因为无法向此请求添加身份验证数据,并且Apache Shiro在尝试访问受保护的地址时会阻止它。
由于我无法在Angular端修复它,我认为在服务器端很容易。是的,但我们使用 Guice 4 。
在Guice配置中,我们正确设置了Shiro:
install(new EEShiroModule(getServletContext()));
filter("/services/*").through(GuiceShiroFilter.class);
到目前为止一切顺利。但是现在我想在系统中打个洞,允许OPTIONS
请求不被认证。我在这里找到了类似的方法:http://blog.awolski.com/cors-dart-dropwizard-and-shiro/。
最后我应该覆盖 BasicHttpAuthenticationFilter
,但它不像Spring或Ini配置那么简单,因为我无法覆盖类绑定。
最好的方法是什么?谢谢!
答案 0 :(得分:1)
今天我遇到了类似的问题。对于CORS请求,由于浏览器无法向OPTIONS
请求添加自定义标头,因此Apache Shiro会将OPTIONS
飞行前请求视为未经身份验证。
解决这个问题。我覆盖了AuthenticatingFilter
的{{1}}方法,以便在请求的方法为isAccessAllowed
时始终返回true。
OPTIONS
如果您使用的是public class CORSAuthenticationFilter extends AuthenticatingFilter {
@Override
protected 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 super.isAccessAllowed(request, response, mappedValue);
}
}
,则还需要覆盖它。
PermissionsAuthorizationFilter
重写这些过滤器后。应该声明它们是shiro配置文件中正在运行的实现。
这就是我如何让事情发挥作用。希望它有所帮助,但有点晚了。