onceperrequestfilter(Shiro中的filter)

本文目录
Shiro中的filter
DefaultFilter
shiro中提供的默认filter
FilterChainManager
通过配置创建对应的filterChain
Shiro通过此配置可初始化FilterChainManager中的filterChain,结构为 url -》filter列表
SpringShiroFilter
入口filter,拦截所有请求,通过请求的url匹配到对应的filterChain,然后通过Chain对请求进行,认证或者授权的处理
OncePerRequestFilter
OncePerRequestFilter 用于防止多次执行 Filter;也就是说一次请求只会走一次拦截器链;
另外提供 enabled 属性,表示是否开启该拦截器实例
实现了 doFilter 方法,提供了抽象方法 doFilterInternal 。
在doFilter中验证当前的Filter有没有执行过,如果已经执行过一次或者当前filter被禁用,则直接执行下一个Filter。如果没有执行过则执行 doFilterInternal 方法
AbstractShiroFilter
创建Subject,绑定subject到当前线程,根据url获取filterChain并执行filterChain
PathMatchingFilterChainResolver
通过请求的url来匹配FilterChainManager中的FilterChain,这个方法会返回一个 ProxiedFilterChain
ProxiedFilterChain
存储了tomcat的Filter 和shiro内部的filter
shiro内部的过滤器执行完后会切换到tomcat的过滤器继续执行
默认filter
除了LogoutFilter,其他都继承了AdviceFilter
AdviceFilter
AdviceFilter 提供了 AOP 风格的支持,类似于 SpringMVC 中的 Interceptor:
权限验证在preHandle中实现
PathMatchingFilter
PathMatchingFilter 提供了基于 Ant 风格的请求路径匹配功能及拦截器参数解析的功能,如
“ /admin roles ”自动根据 “,” 分割,解析成 /admin -》 存入 appliedPaths 中
实现了 preHandle 方法,通过请求的url匹配url对应的权限,解析权限串 调用子类的 onPreHandle 对权限进行处理
AnonymousFilter
提供匿名访问功能,实现了 onPreHandle 直接返回true,所以配置 anon 的url任何人都可以访问
AccessControlFilter
提供了资源访问控制的基础功能
实现了 onPreHandle ,这里拆分出了
isAccessAllowed (是否允许访问)和 onAccessDenied (访问被拒绝时)这两个方法供子类实现
AuthenticationFilter
实现了 isAccessAllowed 方法,验证用户是否已经登录,没有登录将被拒绝
FormAuthenticationFilter
继承自 AuthenticationFilter 只有用户登录过后才能通过
实现了 onAccessDenied 方法,如果请求的地址是登录地址,这里会尝试自动登录,否则跳转到登录页面
BasicHttpAuthenticationFilter
提供了基于 HttpBasic认证的方式
AuthorizationFilter
实现了 onAccessDenied 方法,如果没有认证通过,则跳转到登录或者认证失败的页面
PermissionsAuthorizationFilter
对用户所访问资源的权限进行认证
HttpMethodPermissionFilter
将HTTP请求的方法(例如GET、POST等)转换为相应的动作并构造一个相应的权限
如get 被转换为 read,put 转换为 update,post转换为create等
权限配置:/users perms
请求: get /users
将会验证 用户是否拥有users:read权限
RolesAuthorizationFilter
验证用户是否用对对应的角色
UserFilter
实现了 isAccessAllowed 和 onAccessDenied 方法,验证用户是否登录过,如果验证未通过则跳转到登录页面
hiddenhttpmethodfilter 有什么用
HiddenHttpMethodFilter的父类是OncePerRequestFilter,它继承了父类的doFilterInternal方法,工作原理是将jsp页面的form表单的method属性值在doFilterInternal方法中转化为标准的Http方法,即GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE,然后到Controller中找到对应的方法。例如,在使用注解时我们可能会在Controller中用于@RequestMapping(value = "list", method = RequestMethod.PUT),所以如果你的表单中使用的是《form method="put"》,那么这个表单会被提交到标了Method="PUT"的方法中。
需要注意的是,由于doFilterInternal方法只对method为post的表单进行过滤,所以在页面中必须如下设置:
view plaincopy
《form action="..." method="post"》
《input type="hidden" name="_method" value="put" /》
......
《/form》
而不是使用:
view plaincopy
《form action="..." method="put"》
......
《/form》
同时,HiddenHttpMethodFilter必须作用于dispatcher前,所以在web.xml中配置HiddenHttpMethodFilter时,需参照如下代码:
view plaincopy
《filter》
《filter-name》HiddenHttpMethodFilter《/filter-name》
《filter-class》org.springframework.web.filter.HiddenHttpMethodFilter《/filter-class》
《/filter》
《filter-mapping》
《filter-name》HiddenHttpMethodFilter《/filter-name》
《servlet-name》spring《/servlet-name》
《/filter-mapping》
《servlet》
《servlet-name》spring《/servlet-name》
《servlet-class》org.springframework.web.servlet.DispatcherServlet《/servlet-class》
《init-param》
《param-name》contextConfigLocation《/param-name》
《param-value》classpath:dispatcher.xml《/param-value》
《/init-param》
lt;/servlet》
《servlet-mapping》
《servlet-name》spring《/servlet-name》
《url-pattern》*.html《/url-pattern》
lt;/servlet-mapping》
同样的,作为Filter,可以在web.xml中配置HiddenHttpMethodFilter的参数,可配置的参数为methodParam,值必须为GET,、POST、 HEAD、OPTIONS、PUT、DELETE、TRACE中的一个。

更多文章:
双色球浙江风采超长版2005(2005年浙江超长版双色球走势图)
2026年10月11日 03:20
深圳龙华人民医院疑似病例(西安新增2例确诊1例初筛阳性,当地针对此情况采取了哪些措施)
2026年10月11日 02:40
乌克兰军事威胁俄罗斯代表(俄罗斯平静面对西方制裁,这个国家为什么这么有底气呢)
2026年10月10日 23:40
微信使用代理是什么意思(安装微信时出现“正在使用代理上网,请关闭代理再安装”,是什么意思)
2026年10月10日 19:10






