AuthenticationFilter是个抽象类,需要当前用户必须登录。我们看一下他的isAccessAllowed方法:
protectedboolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
returnsubject.isAuthenticated();//判断是否登录。
}
里面有个successUrl属性,但是这个不是成功登录后跳转的地址,而是一个默认的地址。我们考虑一个在开发中经常用到的场景:我要在淘宝上买东西,在商品详情页输了买10个,但是点击确认后买后却是要求我们登录,然后登录后再跳转到当前的详情页,并且详情页的10依然存在,我之前就好奇他是怎么用一个通用的方法实现的,现在看了shiro的源码有了灵感。他的实现在shiro的webutils中,我先透露一下,他是将上一次访问的url和method以及queryString放在了session中,然后再登录之后先检查在session中有没有之前放入的值,如果放入了就使用之前的url+method+queryString进行重定向。这里说这些只是说明这个类中的successUrl只是一个默认的,备份的路径,只有没有在session中存放的时候才会跳转到这个路径,他的javadoc上也进行了说明。
上面我说的这些在
org.apache.shiro.web.util.WebUtils.redirectToSavedRequest(ServletRequest, ServletResponse, String)方法中说明的,可以在我的博客中WebUtils中查看。
回到这个类里面,这个类是个抽象类,而且没有涉及到onAccessDenied方法,所以一定要注意。
我们继续看他的实现类:
·AuthenticatingFilter<!--[endif]-->
·PassThruAuthenticationFilter
其中在AuthenticatingFilter及其子类中我没有找到在实际中可能会用到的场景,我看了源码,但是觉得离实际生产差的很远,所以我没有记笔记,可能是我水平有限吧。
Shiro的AuthenticationFilter是一个抽象类,确保用户已登录。successUrl属性并非成功登录后的跳转地址,而是默认备用地址。实际场景中,如淘宝购物,登录后能返回原页面并保留状态,这是通过在session中保存上次请求信息实现的。在`WebUtils.redirectToSavedRequest()`方法中处理此逻辑。AuthenticationFilter为抽象类,未覆盖onAccessDenied方法,其子类如AuthenticatingFilter和PassThruAuthenticationFilter可能在特定场景下使用,但作者认为与实际生产环境有一定距离。
2万+

被折叠的 条评论
为什么被折叠?



