Java 在Spring引导中,HandlerInterceptor、用户定义过滤器和Spring安全过滤器中,哪个将首先执行?
我是SpringSecurity的新手,在学习的过程中,我了解到SpringSecurity在内部是一组过滤器。在这里,我有点困惑,默认情况下,Java 在Spring引导中,HandlerInterceptor、用户定义过滤器和Spring安全过滤器中,哪个将首先执行?,java,spring,spring-boot,spring-mvc,spring-security,Java,Spring,Spring Boot,Spring Mvc,Spring Security,我是SpringSecurity的新手,在学习的过程中,我了解到SpringSecurity在内部是一组过滤器。在这里,我有点困惑,默认情况下,HandlerInterceptor,用户定义过滤器和安全过滤器的执行顺序是什么 我尝试搜索internet,但所有人都在谈论这些过滤器之间的差异。Spring安全过滤器(即FilterChainProxy)应该首先执行,因为它的存在是为了保护所有URL访问,因此,在执行其他过滤器之前,它应该首先执行以确保请求具有足够的权限,这是有意义的 Handler
HandlerInterceptor
,用户定义过滤器和安全过滤器的执行顺序是什么
我尝试搜索internet,但所有人都在谈论这些过滤器之间的差异。Spring安全过滤器(即FilterChainProxy
)应该首先执行,因为它的存在是为了保护所有URL访问,因此,在执行其他过滤器之前,它应该首先执行以确保请求具有足够的权限,这是有意义的
HandlerInterceptor
不是ServletFilter
,而是SpringMVC的特性之一。假设它只是SpringMVCServlet中的一些代码(即DispatcherServlet
)。作为示例,这意味着如果定义了任何其他用户定义的过滤器(我假设您所指的用户定义的过滤器是在web.xml
中正常注册的Servletfilter
或类似的东西),它将在HandlerInterceptor
之前执行
总之,他们应该按照以下顺序执行:
Spring安全过滤器
,用户定义过滤器
,handler拦截器
让我用另一种方式来解释这3个
过滤器:Spring安全过滤器
和用户定义过滤器
DispatherServlet后的机制:
HandlerInterceptor
(如下图所示)
由于
HandlerInterceptor
位于DispatcherServlet
之后,由于过滤器总是在到达servlet之前进行处理,我可以自信地判断HandlerInterceptor
位于最后
现在,顺序为Spring Security Filters
vs用户定义的筛选器
如果您使用传统的SpringMVC(而不是SpringBoot),则可以使用xml或基于java的配置。您可以为用户定义的过滤器实现任何订单。您可以将其放置在spring security(springSecurityFilterChain)之后或之前,如下所示
sessionLastAccessTimeUpdateFilter
com.pvn.mvctiles.configuration.SessionLastAccessTimeUpdateFilter
sessionLastAccessTimeUpdateFilter
/*
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
在上面的示例中,SessionLasAccessTimeUpdateFilter顺序在springSecurityFilterChain SessionLasAccessTimeUpdateFilter首先执行之前。如果你需要的话,你可以改变订单。下面给出了等效的java配置
公共类AppInitializer扩展AbstractAnnotationConfigDispatcherServletInitializer
{
@凌驾
启动时公共void(ServletContext ServletContext)引发ServletException
{
super.onStartup(servletContext);
servletContext.addFilter(“SessionlAsAccessTimeUpdateFilter”,新SessionlAsAccessTimeUpdateFilter())
.addMappingForUrlPatterns(null,true,“/*”);
addFilter(“springSecurityFilterChain”,新的DelegatingFilterProxy(“springSecurityFilterChain”))
.addMappingForUrlPatterns(null,true,“/*”);
}
}
但是,与传统的spring方法相比,spring引导不同,并且有很多限制。Spring boot将不支持web.xml,只允许通过FilterRegistrationBean
注册筛选器,但此处注册的筛选器位于FilterChainProxy
之后
但SpringSecurity提供了通过以下方式在SpringSecurity过滤器之间添加过滤器的规定:
请注意,spring security有许多代理过滤器或spring托管bean,这些过滤器具有特定的顺序。如果通过为UsernamePasswordAuthenticationFilter
创建子类来实现筛选器,则自定义筛选器顺序将与为UsernamePasswordAuthenticationFilter
定义的顺序相同
最后,HandlerInterceptor机制排在最后,但是spring安全过滤器和用户定义的过滤器可以以任何顺序出现,这取决于您的配置
要大致了解这些过滤器的执行情况,您可以参考我想您之前没有考虑添加过滤器,handlerInterceptor排在最后,但是用户定义的过滤器可以在任何地方。因为我不知道用户定义的过滤器是什么意思,这就是为什么我假设它是在web.xml或类似文件中注册的普通Servlet过滤器