Shiro使用了与Servlet一样的Filter接口进行扩展
实现原理
Shiro对于请求的鉴权的实现也是通过过滤器(或者说是拦截器)来实现的,但是Spring项目中有拦截链机制,会有多个拦截器生效,包括系统内置的以及Shiro注入的,所以需要搞懂他的过滤的实现机制就需要去弄明白这些过滤器是如何过滤的。
那就开始吧
ApplicationFilterChain 简介
Tomcat的类ApplicationFilterChain是一个Java Servlet API规范javax.servlet.FilterChain的实现,用于管理某个请求request的一组过滤器Filter的执行。当针对一个request所定义的一组过滤器Filter处理完该请求后,最后一个doFilter()调用才会执行目标Servlet的方法service(),然后响应对象response会按照相反的顺序依次被这些Filter处理,最终到达客户端。
filters中包含了5个过滤器:
CharacterEncodingFilter:spring内置过滤器,用来指定请求或者响应的编码格式。
FormContentFilter:该过滤器针对DELETE,PUT和PATCH这三种HTTP method分析其FORM表单参数,将其暴露为Servlet请求参数。
RequestContextFilter:该过滤器将当前请求暴露到当前线程。
SpringShiroFilter:shiro内置过滤器,包装 Request 和 Response,使它们由原来的 HttpServlet 系列包装为 ShiroHttpServletRequest等。
Tomcat WebSocket Filter:webSocket 相关过滤器。
这些注入的过滤器会通过internalDoFilter来执行过滤工作