shiro Filter--拦截器

时间:2022-09-18 11:12:40

一 shiro自带的filter:下面主要叙述顺序是 NameableFilter-》OncePerRequestFilter-》AdviceFilter-》PathMatchingFilter-》AuthenticationFilter(AuthenticatingFilter)-》FromAuthenticationFilter

shiro Filter--拦截器

①NameableFilter有一个name属性,定义每一个filter的名字。在FilterChainManager中会调用配置文件中的配置属性名字来为每一个filter命名以及为默认的filter命名,如authc。

shiro Filter--拦截器

②OncePerRequestFilter保证客户端请求后该filter的doFilter只会执行一次。

shiro Filter--拦截器

可以看出doFilter的实质内容是在doFilterInternal方法中完成的。所以实质上是保证每一个filter的 doFilterInternal只会被执行一次,例如在配置中 配置路径 /user/** = authc,authc.则只会执行authc中的doFilterInternal一次。doFilterInternal非常重要,在shiro整个filter体系中的核心方法及实质入口。另外,shiro是通过在request中设置一个该filter特定的属性值来保证该filter只会执行一次的。

其次可以看到有一个enabled属性,表示是否启用这个filter,默认是true,可以设置成false,则会跳过这个filter的doFilterInternal方法而去执行filter链中其他filter。

③AdviceFilter中主要是对doFilterInternal做了更细致的切分

shiro Filter--拦截器

shiro Filter--拦截器

这有点像springmvc中的Interceptor,doFilterInternal会先调用preHandle做一些前置判断,如果返回false则filter链不继续往下执行,postHandle在目标方法(即客户端请求的接口)正常(未抛出异常)执行后完成一些操作,默认不做任何操作。在finally中的cleanup方法中会调用afterCompletion方法,不管目标方法是否出现异常都会继续操作。默认也是空。 AdviceFilter总体是对OncePerRequestFilter中的doFilterInternal进一步细化控制。

④PathMatchingFilter主要是对preHandle做进一步细化控制,该filter为抽象类,其他路径直接通过:preHandle中,若请求的路径非该filter中配置的拦截路径,则直接返回true进行下一个filter。若包含在此filter路径中,则会在isFilterChainContinued做一些控制,该方法中会调用onPreHandle方法,所以子类可以在onPreHandle中编写filter控制流程代码(返回true或false)。

shiro Filter--拦截器

shiro Filter--拦截器

⑤AccessControlFilter中的对onPreHandle方法做了进一步细化,isAccessAllowed方法和onAccessDenied方法达到控制效果。这两个方法都是抽象方法,由子类去实现。到这一层应该明白。isAccessAllowed和onAccessDenied方法会影响到onPreHandle方法,而onPreHandle方法会影响到preHandle方法,而preHandle方法会达到控制filter链是否执行下去的效果。所以如果正在执行的filter中isAccessAllowed和onAccessDenied都返回false,则整个filter控制链都将结束,不会到达目标方法(客户端请求的接口),而是直接跳转到某个页面(由filter定义的,将会在authc中看到)。

shiro Filter--拦截器

shiro Filter--拦截器

⑥AuthenticationFilter和AuthenticatingFilter认证的filter,在抽象类中AuthenticatingFilter实现了isAccessAllowed方法,该方法是用来判断用户是否已登录,若未登录再判断是否请求的是登录地址,是登录地址则放行,否则返回false终止filter链。

shiro Filter--拦截器

shiro Filter--拦截器

shiro Filter--拦截器

另外可以看到提供了executeLogin方法实现用户登录的,还定义了onLoginSuccess和onLoginFailure方法,在登录成功或者失败时做一些操作。登录将在下面详细说明。

⑦FormAuthenticationFiltershiro提供的登录的filter,如果用户未登录,即AuthenticatingFilter中的isAccessAllowed判断了用户未登录,则会调用onAccessDenied方法做用户登录操作。若用户请求的不是登录地址,则跳转到登录地址,并且返回false直接终止filter链。若用户请求的是登录地址,若果是post请求则进行登录操作,由AuthenticatingFilter中提供的executeLogin方法执行。否则直接通过继续执行filter链,并最终跳转到登录页面(因为用户请求的就是登录地址,若不是登录地址也会重定向到登录地址).

shiro Filter--拦截器

AuthenticatingFilter中的executeLogin

shiro Filter--拦截器

若登录成功返回false(FormAuthenticationFiltershiro的onLoginSuccess默认false),则表示终止filter链,直接重定向到成功页面,甚至不到达目标方法直接返回了。若登录失败,直接返回true(onLoginFailure返回false),继续执行filter链并最终跳转到登录页面,该方法还会设置一些登录失败提示 shiroLoginFailure,在目标方法中可以根据这个错误提示制定客户端更加友好的错误提示。

shiro Filter--拦截器

shiro Filter--拦截器

二 自定义filter

一般自定义filter可以继承三种:

①OncePerRequestFilter只需实现doFilterInternal方法即可,在这里面实现filter的功能。切记在该方法中最后调用filterChain.doFilter(request, response),允许filter链继续执行下去。可以在这个自定义filter中覆盖isEnable达到控制该filter是否需要被执行(实质是doFilterInternal方法)以达到动态控制的效果,一般不建议直接继承这个类;

②AdviceFilter  中提供三个方法preHandle postHandle afterCompletion:若需要在目标方法执行前后都做一些判断的话应该继承这个类覆盖preHandle 和postHandle 。

③PathMatchingFilter中preHandle实质会判断onPreHandle来决定是否继续往下执行。所以只需覆盖onPreHandle方法即可。

④AccessControlFilter:最常用的,该filter中onPreHandle调用isAccessAllowed和onAccessDenied决定是否继续执行。一般继承该filter,isAccessAllowed决定是否继续执行。onAccessDenied做后续的操作,如重定向到另外一个地址、添加一些信息到request域等等。

④若要自定义登录filter,一般是由于前端传过来的需求所定义的token与shiro默认提供token的不符,可以继承AuthenticatingFilter ,在这里面实现createToken来创建自定义token。另外需要自定义凭证匹配器credentialsMatcher。重写public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info)即可。realm也需要自定义以返回自定义的token。

三shiro登录

由前面filter链可以看出登录已经很清晰了。shiro提供的FormAuthenticationFilter认证过滤器,继承了AuthenticatingFilter ,若已登录则isAccessAllowed直接通过,否则在 onAccessDenied中判断是否是登录请求,若是请求登录页面,直接通过,若是post提交登录信息则会进行登录操作。否则直接跳转到登录页面。登录是由shiro的securityManager完成的,securityManager从Realm获取用户的真实身份,从FormAuthenticationFilter的createToken获取用户提交的token,credentialsMatcher完成是否匹配成功操作。

shiro Filter--拦截器的更多相关文章

  1. 秒极啊!手把手带你进行shiro授权拦截器的重写,学到了学到了

    shiro整合前后端分离的springboots,Vue项目真的是有很多大坑啊. 今天我的主题是:如何设置shiro过滤器. 遇到问题:我的项目是前后端分离的,shiro里面有一个shiroFilte ...

  2. java:(json,ajax,path,Oracle的分页实例,Filter拦截器)

    1.json: <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  3. shiro中拦截器机制

    8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3.1规范>http://www.iteye.com ...

  4. Java filter拦截器的使用

    1.web.xml配置 <!-- 验证是否登录 拦截功能 --> <filter> <filter-name>isLogin</filter-name> ...

  5. spring filter拦截器

    实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面.比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限 ...

  6. Filter拦截器和Listen监听器

    Filte过滤器概述 1   过滤器是一个驻留在服务器端的Web组件,可以截取用户端和资源之间的请求响应信息,并对信息进行过滤 过滤的工作流程. 过滤器作用描述 1  ,在HttpServletReq ...

  7. MVC5-11 浅谈拦截器

    Filter拦截器 Aop是MVC的主要设计方式之一,而微软也希望我们在使用MVC的时候更好的使用拦截器来进行切面编程.拦截器则是Mvc中的一大亮点与重点 AOP(面向切面)编程已经广泛应用在各个项目 ...

  8. 在ASP&period;NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

  9. SpringMVC拦截器(慕课网)

    拦截器:通过统一拦截从浏览器发往服务器的请求来完成功能的增强 使用场景:解决请求的共性问题 如:乱码.权限验证 基本工作原理:拦截器和过滤器的工作原理相似 乱码问题:使用Spring过滤器(Filte ...

  10. SpringBoot------自定义拦截器

    1.添加pom.xml使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

随机推荐

  1. 利用联合双边滤波或引导滤波进行升采样&lpar;Upsampling&rpar;技术提高一些耗时算法的速度。

    这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...

  2. lua中实现异步资源读写

    同样还是更新方面的需求,当我们检测到版本是新安装的以后,要进行upd目录清除.如果使用os.execute执行 rm -rf ooxx 是非常快的但由于os.execute一旦报错,那整个lua进程就 ...

  3. Win7去除桌面残影的方法

    用户升级到Win7系统后使用正常,就是系统桌面会留有残影,怎么样也去不掉,影响用户的使用,那么要如何将这些残影去掉呢?可从计算机属性中进行相关配置. 解决方法 一.在计算机面板上,右键点击“计算机”, ...

  4. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  5. Ubuntu 13&period;10 安装 ia32-lib

    Ubuntu 13.10下面不参直接安装ia32-libs,直接安装的时候会提示下面的信息: output$ sudo apt-get install ia32-libs Reading packag ...

  6. leetcode Reverse Nodes in k-Group python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

  7. hdu - 2586 How far away ?(最短路共同祖先问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 最近公共祖先问题~~LAC离散算法 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起 ...

  8. Kubernetes Ingress Controller的使用及高可用落地

    Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...

  9. ios app 实现热更新(无需发新版本号实现app加入新功能)

    眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js ...

  10. k8s入门

    一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机:万级容器:相如无亿,K8s有亿 ...