shiro学习24-shiro提供的filter-AuthenticationFilter

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及其子类中我没有找到在实际中可能会用到的场景,我看了源码,但是觉得离实际生产差的很远,所以我没有记笔记,可能是我水平有限吧。

 

 

 

 

相关推荐