むし 2023-05-26 10:02 采纳率: 71.4%
浏览 14
已结题

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

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

  • 写回答

3条回答 默认 最新

  • usp1994 2023-05-26 10:13
    关注

    可以通过调试工具来定位到拦截器或过滤器等类。一般来说,拦截器和过滤器等用于在请求进入 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() {
            // 销毁
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 已采纳回答 5月27日
  • 创建了问题 5月26日

悬赏问题

  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关
  • ¥15 关于浏览器控制台js报错问题-swiper.js相关
  • ¥15 opencv.js内存,CPU飙升
  • ¥15 植物重测序snp数据Treemix分析出现问题!
  • ¥15 怎么让当前页面只能有一人在编辑
  • ¥15 python程序长时间运行卡死,付费求解决方案
  • ¥20 VM打开不了ubuntu虚拟机,如何解决?