接上篇,我们又来到了最关键的doFilterInternal方法中,这一次我们会走AdviceFilter中的doFilterInternal方法。这个方法里面,主要有两句代码,preHandle方法主要作用是判断是否继续执行过滤器的,当返回true时,继续执行过滤器。executeChain方法就是真正执行过滤器了。
preHandle是经常被重写的方法,因为我们认证的个性化配置就是在这个方法里面实现的。在AdviceFilter类里就有这个方法的实现,但是是直接return true,代表所有请求都往下执行,所以没有看的必要,我们看一下它的子类PathMatchingFilter里面的实现吧,如果你不重写这个方法的话,一般都会走这个实现。这个方法里面主要有一个isFilterChainContinued方法和一个appliedPaths属性,但是这个属性的值是怎么来的,我还没搞清楚,就暂且不讨论了,isFilterChainContinued方法还是要看它的具体方法。
isFilterChainContinued方法里面只有一句代码,就是onPreHandle方法的调用,这个方法重写的地方很多,一般要认证的请求会走AccessControlFilter,不需要认证的请求会走AnonymousFilter,AnonymousFilter里面的onPreHandle方法是直接return true,表示直接往下走,所以我们还是来看看AccessControlFilter中的实现吧。
AccessControlFilter中的onPreHandle方法中调用了两个方法,isAccessAllowed和onAccessDenied,一般来讲,isAccessAllowed方法是认证的方法,onAccessDenied方法是认证失败之后的方法。
你完全可以重写这里的isAccessAllowed方法来实现你的个性化认证,shiro默认的实现是AuthenticationFilter中的实现,具体实现是直接取subject中的authenticated参数的值,authenticated为true则认证通过,false则不通过,而authenticated的值在subject创建时就被赋予了。
onAccessDenied默认实现是FormAuthenticationFilter中的实现,具体实现是直接跳到登录页面了。这里值得注意的是,一般前后端分离的项目认证失败后,应该是直接返回认证失败的状态码给前端,所以这个时候必须要重写这个方法,如果不重写的话,前端请求会出现302重定向的错误。
到这里,preHandle方法就算完成调用了,回到上面,当continueChain为true时,表示验证通过,然后执行后面的过滤器,最后到具体的请求地址的方法,返回结果,完成一次请求。当为false时,则表示验证不通过,也就不会往下执行了,直接返回结果了。
另外,这个方法中的postHandle方法,没有默认实现,这个方法表示所有的请求在完成请求,返回请求结果之前的一个操作,如果有需要,可以重写这个方法。