如何找到请求第一个执行的类?

在请求方法进入controller层之前,能通过继承拦截器或过滤器之类的东西提前处理一些信息。
那么有没有什么方法去定位到这些类?
怎么找出自己写的类中哪个类是第一个执行的,哪个类是第二个执行的,以此类推

可以通过调试工具来定位到拦截器或过滤器等类。一般来说,拦截器和过滤器等用于在请求进入 Controller 前或响应返回给客户端前进行处理。具体如何调用和配置,会因框架不同而有所不同,以下是一些常见的定位方法:

拦截器

Spring 拦截器

Spring 框架是一个使用广泛的 Java 框架,其中的拦截器可以通过实现 HandlerInterceptor 接口创建,或者继承 HandlerInterceptorAdapter 类来创建。如果想要定位到第一个执行的拦截器,可以通过 WebMvcConfigurer 接口中的 addInterceptors 方法进行配置。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
    }
}

在上面的代码示例中,MyInterceptor1 会先于 MyInterceptor2 执行。你可以通过断点调试来观察执行的先后顺序。

Struts 2 拦截器

在 Struts 2 中,拦截器是一种用于处理请求的模块化组件,并且每个拦截器都可以精确控制请求的处理流程。如果想配置拦截器执行顺序,可以在 struts.xml 配置文件中通过 interceptor-ref 标签指定。

<package name="default" extends="struts-default">
  <interceptors>
    <interceptor name="myInterceptor1" class="com.example.MyInterceptor1"></interceptor>
    <interceptor name="myInterceptor2" class="com.example.MyInterceptor2"></interceptor>
    <interceptor-stack name="myInterceptorStack">
      <interceptor-ref name="myInterceptor1"/>
      <interceptor-ref name="myInterceptor2"/>
    </interceptor-stack>
  </interceptors>
  <action name="myAction" class="com.example.MyAction">
    <interceptor-ref name="myInterceptorStack"/>
    <result name="success">/result.jsp</result>
  </action>
</package>

在上面的示例中,myInterceptor1 会先于 myInterceptor2 执行。你可以通过断点调试来观察执行的先后顺序。

过滤器

Servlet 过滤器

在 Servlet 中,过滤器是一种拦截 Servlet 请求和响应的组件。我们可以通过实现 javax.servlet.Filter 接口或者继承 javax.servlet.Filter 类来创建过滤器。在 web.xml 文件中,可以通过 <filter><filter-mapping> 元素的组合来对过滤器进行配置和映射,以定位到哪个类是哪个过滤器。

<filter>
  <filter-name>MyFilter1</filter-name>
  <filter-class>com.example.MyFilter1</filter-class>
</filter>
<filter>
  <filter-name>MyFilter2</filter-name>
  <filter-class>com.example.MyFilter2</filter-class>
</filter>
<filter-mapping>
  <filter-name>MyFilter1</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>MyFilter2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

在上面的示例中,MyFilter1 会先于 MyFilter2 执行。你可以通过断点调试来观察执行的先后顺序。

Spring Boot 过滤器

在 Spring Boot 中,默认使用 @WebFilter 注解来创建过滤器,并且可以通过 @Order 注解来设置过滤器的执行顺序。可以通过断点调试来观察执行的先后顺序。

@WebFilter(filterName = "myFilter1", urlPatterns = "/*")
@Order(1)
public class MyFilter1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        // 初始化
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 处理逻辑
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        // 销毁
    }
}
@WebFilter(filterName = "myFilter2", urlPatterns = "/*")
@Order(2)
public class MyFilter2 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        // 初始化
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 处理逻辑
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        // 销毁
    }
}

回答申明:包含AI辅助答案参考ChatGPT Plus版

在Java中,您可以使用拦截器(Interceptor)或过滤器(Filter)来在请求方法进入控制器(Controller)层之前进行预处理。这些类可以用于执行一些共同的任务,例如身份验证、日志记录、参数校验等。

要找出自己编写的拦截器或过滤器的执行顺序,可以根据以下步骤进行定位:

查找配置文件:拦截器和过滤器通常需要在配置文件中进行注册和配置。您可以查找项目的配置文件,例如 web.xml、applicationContext.xml、@Configuration 类等,以找到拦截器或过滤器的配置信息。

检查注册顺序:在配置文件中,您可以查看拦截器或过滤器的注册顺序。通常,注册顺序决定了执行顺序。如果使用XML配置,可以查看注册的顺序;如果使用注解配置,可以查看注解的顺序。

查看拦截器或过滤器类的实现:根据配置文件中的注册顺序,查找对应的拦截器或过滤器类。通过查看这些类的源代码,您可以确定它们的执行顺序。通常,拦截器和过滤器都实现了特定的接口或继承了特定的类,您可以根据这些标识来判断执行顺序。

请注意,拦截器和过滤器的执行顺序可能受到框架的影响,例如使用的Web框架(如Spring MVC)可能有自己的执行顺序规则。因此,您需要针对您使用的具体框架查找相关文档或参考资料,以了解其默认的执行顺序规则或如何自定义执行顺序。

借鉴ChatGPT回答:

在Spring MVC中,有几种方式可以在请求进入Controller之前进行处理:

  1. 拦截器(Interceptor):通过实现HandlerInterceptor接口并注册到Spring配置中,可以在请求处理之前进行拦截。
  2. 过滤器(Filter):通过实现Filter接口并注册到web.xml中,可以在请求处理之前进行过滤。
  3. 监听器(Listener):通过实现ServletRequestListener接口并注册到web.xml中,可以监听请求的创建和销毁,在请求处理之前进行处理。
    要定位这些类的执行顺序,可以:
  4. 通过阅读Spring MVC的工作流程文档,了解大致的执行顺序。拦截器在过滤器之后,控制器之前执行。
  5. 打印日志:在每个类的方法中打印日志,标注类名和方法,然后可以从控制台日志中看到具体的执行顺序。
  6. 设置断点:在IDE中设置断点,当程序运行并触发断点时,可以看到当前执行的是哪一个类的哪个方法,由此推断出顺序。
  7. 根据注解或映射定位:
  • 拦截器通常使用@Interceptor注解注册,可以找到所有使用该注解的拦截器类。
  • 过滤器通常在web.xml中配置具体的映射路径,可以根据路径找到对应过滤器类。
  • 监听器同样在web.xml中配置,根据配置可以找到监听器类。
    一个具体的例子:
    拦截器类:LoginInterceptor
    过滤器类:LoginFilter
    监听器类:LoginListener
    控制器类:LoginController
    则大致执行顺序为:
    LoginListener -> LoginFilter -> LoginInterceptor -> LoginController