servlet-->拦截器中的preHandle和postHandle有什么区别?分别有什么作用?

💕可以直接食用最后结果💕

在Spring框架中,拦截器(Interceptor)是基于Java的Web应用程序中用于拦截请求并执行处理前后逻辑的组件。拦截器可以实现HandlerInterceptor接口,该接口定义了三个方法:preHandle(), postHandle(), 和afterCompletion()。preHandle和postHandle是这三个方法中的前两个,它们的区别和作用如下:

preHandle方法

时机:preHandle()方法在请求处理之前被调用,即在Controller方法(请求处理器)调用之前执行。

作用

权限检查:可以用来进行用户授权认证,比如检查用户是否登录,是否有权访问某个资源等。

日志记录:记录请求信息,用于监控或日志记录。

资源准备:在请求处理前预处理数据。

返回值:

返回true则继续流程(如调用下一个拦截器或处理器)。

返回false则流程中断,Spring将不会调用后续的拦截器或处理器。这时可以通过响应直接输出到客户端。

postHandle方法

时机:postHandle()方法在请求处理后、分发视图前被调用,即在Controller方法调用之后,渲染视图之前执行。

作用

数据处理:可以对请求域中的模型和视图进行调整,比如添加额外的模型数据,选择不同的视图等。

性能监控:可以在视图渲染前完成一些资源的清理,或者记录处理请求所需的时间。

参数

该方法带有ModelAndView参数,允许访问和修改Controller处理后的模型和视图。

反正总而言之~:

preHandle 主要用于请求前的准备工作,权限校验或日志记录等,决定是否继续后续的处理流程。

postHandle 主要用于请求后的处理,但在视图被渲染前,可以操作控制器返回的ModelAndView对象。

在实际应用中,拦截器可以根据需要使用preHandle和postHandle方法来实现各种中间件功能,如日志记录、权限控制、请求处理时间监控等,为开发者提供了一个灵活的方式来插入自定义的请求前后处理逻辑。

下面是一个完整的示例,展示了在Spring MVC配置多个拦截器的代码: ```java @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 注册拦截器1 registry.addInterceptor(new Interceptor1()) .addPathPatterns("/path1/**") .excludePathPatterns("/path1/exclude"); // 注册拦截器2 registry.addInterceptor(new Interceptor2()) .addPathPatterns("/path2/**") .excludePathPatterns("/path2/exclude"); // 注册拦截器3 registry.addInterceptor(new Interceptor3()) .addPathPatterns("/path3/**") .excludePathPatterns("/path3/exclude"); } } public class Interceptor1 implements HandlerInterceptor { // 在请求处理之前调用 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 拦截处理逻辑 return true; } // 在请求处理之后调用,但是在视图被渲染之前调用 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 后处理逻辑 } // 在整个请求结束之后调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 完成处理逻辑 } } // 类似地,定义其他的拦截器类,如Interceptor2、Interceptor3 ``` 在上述示例,我们创建了一个名为WebConfig的配置类,并实现了WebMvcConfigurer接口。通过重写`addInterceptors`方法,我们可以注册多个拦截器。 每个拦截器类都需要实现HandlerInterceptor接口,并根据实际需求实现其的方法。在示例,我们创建了三个拦截器:Interceptor1、Interceptor2和Interceptor3,并在`addInterceptors`方法进行了注册。 在每个拦截器,你可以根据需要实现`preHandle`、`postHandle`和`afterCompletion`等方法来处理请求前、请求后和请求完成时的逻辑。 希望这个示例能帮助你配置多个拦截器。如果你有更多的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值