怎么建设一个优秀的网站,西安公司,做网站如何通过流量赚钱吗,wordpress注册页插件在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。
应用场景
日志记录#xff0c;可以记录请求信息的日志#xff0c;以便进行信息监控、信息统计等。权限检查#xff1a;如登陆检测#xff…在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。
应用场景
日志记录可以记录请求信息的日志以便进行信息监控、信息统计等。权限检查如登陆检测进入处理器检测是否登陆如果没有直接返回到登陆页面。性能监控典型的是慢日志。
在HandlerInterceptorAdapter中主要提供了以下的方法
preHandle在方法被调用前执行。在该方法中可以做类似校验的功能。如果返回true则继续调用下一个拦截器。如果返回false则中断执行也就是说我们想调用的方法 不会被执行但是你可以修改response为你想要的响应。postHandle在方法执行后调用。afterCompletion在整个请求处理完毕后进行回调也就是说视图渲染完毕或者调用方已经拿到响应。
HandlerInterceptor
public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception {}default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception {}
}AsyncHandlerInterceptor
public interface AsyncHandlerInterceptor extends HandlerInterceptor {default void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
}abstract class HandlerInterceptorAdapter
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {public HandlerInterceptorAdapter() {}public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception {}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception {}public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
}看到这3个类和接口关系我们就明白了集成 HandlerInterceptorAdapter 只是为了能让我们只重写自己需要的方法即可,如果我们需要全部重写,也可以直接实现接口
运行流程总结如下
拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。会先按照顺序执行所有拦截器的preHandle方法一直遇到return false为止比如第二个preHandle方法是return false则第三个以及以后所有拦截器都不会执行。若都是return true则按顺序加载完preHandle方法。然后执行主方法自己的controller接口若中间抛出异常则跟return false效果一致不会继续执行postHandle只会倒序执行afterCompletion方法。在主方法执行完业务逻辑页面还未渲染数据时按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false则会执行第二个和第一个的postHandle方法和afterCompletionpostHandle都执行完才会执行这个也就是页面渲染完数据后执行after进行清理工作方法。postHandle和afterCompletion都是倒序执行
编写拦截器
public class LoginInterceptor extends HandlerInterceptorAdapter {Logger logger LoggerFactory.getLogger(getClass());Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(LoginInterceptorpreHandle);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception {System.out.println(LoginInterceptorpostHandle);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception {System.out.println(LoginInterceptorafterCompletion);}Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(LoginInterceptorafterConcurrentHandlingStarted);}}
public class LoginInterceptor2 extends HandlerInterceptorAdapter {Logger logger LoggerFactory.getLogger(getClass());Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(LoginInterceptor2preHandle);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception {System.out.println(LoginInterceptor2postHandle);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception {System.out.println(LoginInterceptor2afterCompletion);}Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(LoginInterceptor2afterConcurrentHandlingStarted);}}WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer接口的简单抽象增加了一些默认实现但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被废弃 。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport
实现WebMvcConfigurer配置拦截器
Configuration
public class SpringMVCConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginInterceptor());registry.addInterceptor(new LoginInterceptor2());}
}自行验证上面运行流程总结吧 不过多的赘述了