展开

关键词

快速学习-拦截器

afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。 public class FirstHandlerInterceptor implements HandlerInterceptor { @Override public void afterCompletion arg2, Exception arg3) throws Exception { System.out.println(this.getClass().getName() + " - afterCompletion public class FirstHandlerInterceptor implements HandlerInterceptor { @Override public void afterCompletion com.atguigu.springmvc.interceptors.FirstHandlerInterceptor - afterCompletion 执行顺序图解 ?

25310

SpringBoot中的HandlerInterceptorAdapter

afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。 关于 afterConcurrentHandlingStarted 官方文档是这样写的:当处理程序同时执行时,调用而不是postHandle和afterCompletion。 然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。 若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后 (postHandle和afterCompletion都是倒序执行) HandlerInterceptorAdapter 用来做拦截器还是很方便的,可以用来实现如下应用场景: 日志记录,可以记录请求信息的日志

10950
  • 广告
    关闭

    什么是世界上最好的编程语言?丨云托管征文活动

    代金券、腾讯视频VIP、QQ音乐VIP、QB、公仔等奖励等你来拿!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SpringFramework之HandlerInterceptor

    3位置,调用HandlerExecutionChain的applyPreHandle,如下,逐个调用preHandle方法,只要preHandle返还false,就会你像调用afterCompletion ,由List-5可以看出,afterCompletion中抛出异常,会被Spring框架吞噬,每个HandlerInterceptor的afterCompletion方法中,拿到的异常都是null——看 , response, this.handler, ex); } catch (Throwable ex2) { logger.error("HandlerInterceptor.afterCompletion 图1      如图1所示, 如果执行preHandle的链中抛出异常,那么逆向执行afterCompletion,不会执行postHandle;如果postHandle抛出异常,则逆向执行afterCompletion 如果没有抛出异常,正常情况下,先执行完preHandle链,之后调用controller的方法,之后调用逆向postHandle链,之后逆向执行afterCompletion链,如图1中右边的竖行方向调用所示

    40630

    Spring TX 事务扩展点

    public void beforeCompletion() { } @Override public void afterCommit() { } @Override public void afterCompletion * @see TransactionSynchronization#afterCompletion(int) * @see TransactionSynchronization#STATUS_COMMITTED * @see TransactionSynchronization#afterCompletion(int) * @see TransactionSynchronization#STATUS_ROLLED_BACK * @see TransactionSynchronization#afterCompletion(int) */ AFTER_COMPLETION }

    30720

    SpringBoot拦截器及源码分析

    /** * Trigger afterCompletion callbacks on the mapped HandlerInterceptors. ); } } } 通过上面的代码,我们知道对于拦截器的afterCompletion方法,是反向执行的。 3.6 异常处理 如果在执行doDispatch方法过程中,抛出了异常,在catch模块,都会触发执行afterCompletion方法 ? 如果当前拦截器返回为false,倒序执行所有已经执行了的拦截器的afterCompletion。 (3)如果任何一个拦截器返回false,执行返回,不执行目标方法。 (6)前面的步骤有任何异常都会触发倒序执行afterCompletion方法。 (7)页面成功渲染后,也会倒序执行afterCompletion方法。 ?

    15810

    Spring 详解(三)------- SpringMVC拦截器使用

    在实际应用中,咱们一般都是通过实现 HandlerInterceptor 接口或者继承 HandlerInterceptorAdapter 抽象类,复写 preHandle()、postHandle() 和 afterCompletion 实现 HandlerInterceptor 接口(需要实现三个方法) 在 HandlerInterceptor 接口中,定义了 3 个方法,分别为 preHandle()、postHandle() 和 afterCompletion afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex 异步线程完成之后执行preHandle、postHandle、afterCompletion。 ------- Intercepter2 afterCompletion ------- Intercepter1 页面上正常返回 测试结果2(第一个拦截器的 preHandle 返回 false)

    28140

    Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

    response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion afterCompletion:在 DispatcherServlet 完全处理完请求后被调用,可用于清理资源等。 Exception { System.out.println("执行Test1Interceptor postHandle方法-->02"); } @Override public void afterCompletion ) throws Exception { System.out.println("执行Test2Interceptor postHandle方法-->02"); } public void afterCompletion 方法-->03 执行Test1Interceptor afterCompletion方法-->03 通过示例,简单的说多个拦截器执行流程就是先进后出。

    91341

    猿蜕变系列8——一文搞懂Interceptor操纵姿势

    Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion response, Object handler) throws Exception; 返回值为 boolean类型,如果返回为 true,就会执行controller方法,并且会将afterCompletion void afterCompletion( HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("==afterCompletion ==被执行了 =FirstInterceptor=afterCompletion==被执行了 preHandle方法是按照配置顺序执行的,而postHandle和afterCompletion方法是按照配置逆序执行的

    15030

    使用springmvc的拦截器应用

    HandlerInterceptor2..afterCompletion.. HandlerInterceptor1..afterCompletion.. HandlerInterceptor1..afterCompletion.. 从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller 总结: preHandle按拦截器定义顺序调用 postHandler按拦截器定义逆序调用 afterCompletion按拦截器定义逆序调用 postHandler在拦截器链内所有拦截器返成功调用 afterCompletion

    4510

    Spring Web MVC 拦截器

    Exception { System.out.println("在目标方法执行之后视图对象返回之前执行"); } @Override public void afterCompletion 时才能被调用,且它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作 1.3.2 afterCompletion 则会执行目标资源,如果返回 false 则不执行目标资源;多个拦截器情况下,配置在前的先执行,配置在后的后执行;单个拦截器中的方法执行顺序是:preHandler ☞ 目标资源 ☞ postHandle ☞ afterCompletion preHandler_1 ☞ preHandler_2 ☞ ··· ☞ preHandler_n ☞ 目标资源 ☞ postHandle_n ☞ ··· ☞ postHandle_2 ☞ postHandle_1 ☞ afterCompletion_n ☞ ··· ☞ afterCompletion_2 ☞ afterCompletion_1

    19910

    Spring 拦截器流程及多个拦截器的顺序

    response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion 在 HandlerInterceptor 中共有三个方法,每个方法的含义如下: preHandler:进入请求方法之前执行; postHandler:请求方法执行完成之后执行; afterCompletion 拦截器的执行流程 在 preHandle 方法中,它的返回值是 boolean 类型的,它的返回值影响着请求方法,以及 postHandle 和 afterCompletion 的执行 2021-05-05 16:02:08.111 INFO 88509 --- [nio-8081-exec-6] com.example.demo.TestInterceptor : afterCompletion 注意观察输出的顺序,preHandle 方法是按注册顺序进行执行的,而 postHandle 和 afterCompletion 跟注册顺序是相反的。

    48440

    SpringMVC源码解析-HandlerExecutionChain

    triggerAfterCompletion 触发afterCompletion执回调的映射HandlerInterceptors。 只会调用afterCompletion执行对于其preHandle调用已成功完成并返回true的拦截器 void triggerAfterCompletion(HttpServletRequest request this.interceptorIndex; i >= 0; i--) { HandlerInterceptor interceptor = interceptors[i]; try { interceptor.afterCompletion response, this.handler, ex); } catch (Throwable ex2) { logger.error("HandlerInterceptor.afterCompletion

    9910

    Spring Boot 2.X(九):Spring MVC - 拦截器(Interceptor)

    afterCompletion:在 DispatcherServlet 完全处理完请求后被调用,可用于清理资源等。 Exception {         System.out.println("执行postHandle方法-->02");      }      @Override      public void afterCompletion       System.out.println("执行Test1Interceptor postHandle方法-->02");    }    @Override    public void afterCompletion handler, Exception ex)            throws Exception {        System.out.println("执行Test1Interceptor afterCompletion 方法-->03 执行Test1Interceptor afterCompletion方法-->03 通过示例,简单的说多个拦截器执行流程就是先进后出。

    87221

    学习SpringMVC——拦截器

    FirstInterceptor.preHandle->HandlerAdapter.handle->FirstInterceptor.postHanle->DispatcherServlet.render->FirstInterceptor.afterCompletion 可以总结出preHandler是先进先执行,而postHandler是先进后执行 void afterCompletion(HttpServletRequest request, HttpServletResponse HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("Interceptor:afterCompletion interceptors>   最后启动tomcat服务,得到控制台输出结果为:     Interceptor:preHandle     Interceptor:postHandle     Interceptor:afterCompletion HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("SecondInterceptor:afterCompletion

    33380

    聊聊如何让你的业务代码具有可扩展性

    多个afterCompletion按倒叙输出 */ default void afterCompletion(Invocation invocation){} } 2、创建处理器链 i++) { int j = canExecCount - i - 1; abstarctHandlers.get(j).afterCompletion return false; } } return true; } @Override public void afterCompletion (Invocation invocation) { System.out.println("名称校验-->afterCompletion:" + Arrays.toString(invocation.getArgs (Invocation invocation) { System.out.println("参数转换-->afterCompletion:" + Arrays.toString(invocation.getArgs

    7230

    Spring MVC中的拦截器过滤器HandlerInterceptorAdapter的使用

    后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView;  afterCompletion在DispatcherServlet完全处理完请求后被调用 Controller * 然后进入拦截器链, * 从最后一个拦截器往回执行所有的postHandle() * 接着再从最后一个拦截器往回执行所有的afterCompletion ** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion () */ @Override public void afterCompletion(HttpServletRequest request, handler, Exception ex) throws Exception { log.info("==============执行顺序: 3、afterCompletion

    36210

    Spring学习笔记(7)一Spring MVC拦截器

    afterCompletion()方法:该方法会在整个请求完成,即视图渲染结束之后执行(DispatcherServlet渲染了ModelAndView视图之后)。 "************DemoInterceptor1 postHandle executed**********"); } @Override public void afterCompletion 3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。 测试案例: 通过一个测试程序来验证它的执行流程。 System.out.println("CustomInterceptor....postHandle"); } @Override public void afterCompletion 拦截器配置在前),在程序中的执行流程如下图所示: 从图可以看出,当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion

    6830

    SpringMVC拦截器

    logger = LoggerFactory.getLogger(getClass()); /** * 在业务处理器处理请求之前被调用 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion 执行下一个拦截器,直到所有的拦截器都执行完毕 再执行被拦截的Controller 然后进入拦截器链, * 从最后一个拦截器往回执行所有的postHandle() 接着再从最后一个拦截器往回执行所有的afterCompletion "); } /** * 在DispatcherServlet完全处理完请求后被调用 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion () */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse Object handler, Exception ex) throws Exception { logger.info("==============执行顺序: 3、afterCompletion

    36230

    SpringBoot之Interceptor拦截器

    . */ @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion

    1.1K10

    SpringMVC实战中如何权限管理详解!!!

    static_resources/images/"/> 3.自定义拦截器 SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。 -- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> </mvc:interceptors> 我的拦截逻辑是 ** * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 * * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion () */ @Override public void afterCompletion(HttpServletRequest request,

    25120

    扫码关注云+社区

    领取腾讯云代金券