Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring引导中,HandlerInterceptor、用户定义过滤器和Spring安全过滤器中,哪个将首先执行?_Java_Spring_Spring Boot_Spring Mvc_Spring Security - Fatal编程技术网

Java 在Spring引导中,HandlerInterceptor、用户定义过滤器和Spring安全过滤器中,哪个将首先执行?

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

我是SpringSecurity的新手,在学习的过程中,我了解到SpringSecurity在内部是一组过滤器。在这里,我有点困惑,默认情况下,
HandlerInterceptor
,用户定义过滤器和安全过滤器的执行顺序是什么

我尝试搜索internet,但所有人都在谈论这些过滤器之间的差异。

Spring安全过滤器(即
FilterChainProxy
)应该首先执行,因为它的存在是为了保护所有URL访问,因此,在执行其他过滤器之前,它应该首先执行以确保请求具有足够的权限,这是有意义的

HandlerInterceptor
不是Servlet
Filter
,而是SpringMVC的特性之一。假设它只是SpringMVCServlet中的一些代码(即
DispatcherServlet
)。作为示例,这意味着如果定义了任何其他用户定义的过滤器(我假设您所指的用户定义的过滤器是在
web.xml
中正常注册的Servlet
filter
或类似的东西),它将在
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过滤器