SpringMVC 拦截器
# SpringMVC 拦截器
Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理
Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
了解Java Servlet 的过滤器:JavaWeb学习记录 Servlet过滤监听应用 (opens new window)
拦截器定义
在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置
拦截器类 实现
HandlerInterceptor
接口配置文件
.xml
添加 拦截器<!-- 拦截器集合--> <mvc:interceptors> <!--指定干活的拦截器--> <mvc:interceptor> <!--请求规则--> <mvc:mapping path="/**"/> <!--指定类 拦截器(前提:继承接口)--> <bean class="com.interceptor.MyInterceptor" id="interceptor"></bean> </mvc:interceptor> </mvc:interceptors>
HandlerInterceptor
接口 有三个方法
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
public interface HandlerInterceptor {
/**
* 执行点:控制器方法执行前
* 应用场景:登录验证、...
* @return 是否通行,控制器方法;false:进制通行至控制器
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
/**
* 执行点:在控制器方法执行后,在视图返回前,有机会修改返回值
* 应用场景:日志、登录ip、时间、...
*/
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 {
}
}
拦截器工作流程
SpringMVC 工作流程:
拦截器 方法拦截点:
- preHandle( ):该方法在控制器的处理请求方法前执行(处理器适配器HandlerAdaptor处理前的区间),返回值表示是否中断后续操作
- postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的 模型 和 视图 做进一步的修改
- afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作
应用实现:
应用前提:
需要 xml配置文件添加 拦截器
拦截器类 实现
HandlerInterceptor
接口
项目结构:(保留重要部分)
.
|
├── com
│ ├── controller
| | └── ...
│ ├── interceptor
| | └── MyInterceptor
| User
|
└── webapp
└── jsp
└── ok.jsp
MyInterceptor
类 拦截器
package com.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
/**
* 执行点:控制器方法执行前
* 应用场景:登录验证、...
* @return 是否通行,控制器方法;false:进制通行至控制器
*/
@Override
public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception {
System.out.println("preHandle===============");
return true;
}
/**
* 执行点:在控制器方法执行后,在视图返回前,有机会修改返回值
* 应用场景:日志、登录ip、时间、...
*/
@Override
public void postHandle(HttpServletRequest request , HttpServletResponse response , Object handler , ModelAndView modelAndView) throws Exception {
System.out.println("postHandle===============");
}
/**
* 执行点:在控制器方法执行后,在视图返回后,没机会修改返回值
* 应用场景:全局资源的操作
*/
@Override
public void afterCompletion(HttpServletRequest request , HttpServletResponse response , Object handler , Exception ex) throws Exception {
System.out.println("afterCompletion===============");
}
}
当请求时 都会执行拦截器
上次更新: 2023/03/12, 00:43:49