拦截器
控制器拦截器
- Interceptor 作用
- 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等;
- 权限检查:如登录检测,进入处理器检测是否登录;
- 性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
- 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。
- 自定义 Interceptor
- 如果你需要自定义 Interceptor 的话必须实现
org.springframework.web.servlet.HandlerInterceptor
接口作者:hresh 链接:juejin.cn/post/684490... 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
控制器
java
package wnan.explore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/it")
public class PenController {
@RequestMapping("/02")
@ResponseBody
public String f02(){
System.out.println("f02");
return "f02";
}
}
拦截器实体类,接口实现的方式
java
package wnan.explore.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class ExploreInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("方法 preHandle");
return true;
}
@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");
}
}
实现接口:
org.springframework.web.servlet.HandlerInterceptor
重写默认方法
preHandle()
执行处理程序之前的拦截点。也就是进入控制器前执行前
HttpServletRequest request
:当前 HTTP 请求HttpServletRequest request
:当前 HTTP 响应Object handler
:表示选择执行的处理器(handler),通常是一个控制器类的实例。在这个方法中,可以根据handler的类型或实例进行逻辑判断。postHandle()
成功执行处理程序后的拦截点。就是控制器执行后,视图加载前afterCompletion()
请求处理完成后的回调,即渲染视图后 。将在处理程序执行的任何结果上调用,从而允许进行适当的资源清理。
- ex -- 处理程序执行时抛出的任何异常(如果有)
拦截器配置类
java
package wnan.explore.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import wnan.explore.interceptor.ExploreInterceptor;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// InterceptorRegistry里有个InterceptorRegistration列表,把拦截器放入一个新的InterceptorRegistration里进行管理
InterceptorRegistration var1 = registry.addInterceptor(new ExploreInterceptor());
var1.addPathPatterns("/it/02"); // 可以识别 指定路径
}
}
实现接口
org.springframework.web.servlet.config.annotation.WebMvcConfigurer
重写默认方法
addInterceptors
添加 Spring MVC 生命周期拦截器,用于控制器方法调用和资源处理程序请求的预处理和后处理。可以注册拦截器以应用于所有请求,也可以限制为 URL 模式的子集。路径写法:
var1.addPathPatterns("/it/02"); // 可以识别 指定路径
var1.addPathPatterns("/**"); // 可以识别 通用识别 全部路径
var1.addPathPatterns("/it/"); // 可以识别 通用识别 /it路径下的全部路径
var1.addPathPatterns("/it/**"); // 可以识别 通用识别 /it路径下的全部路径
运行结果:
控制器全局异常拦截器
自定义异常
java
package wnan.explore.exception;
public class Demo1Exception extends Exception{
public Demo1Exception(String message) {
super(message);
}
@Override
public String getMessage() {
return super.getMessage();
}
}
自定义异常,继承实现,通常继承Exception或者Throwable类,重写某些方法,Throwable是实体类,居然不是接口,哈哈。
控制器:
java
package wnan.explore.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import wnan.explore.exception.Demo1Exception;
@Controller
@RequestMapping("/it")
public class PenController {
@GetMapping("/02")
@ResponseBody
public String f02(int code) throws Demo1Exception {
System.out.println("PenController 执行方法 f02");
if (code==0) throw new Demo1Exception("参数错误");
return "true111";
}
}
全局异常拦截器
java
package wnan.explore.exception;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalMvcExceptionHandler {
@ExceptionHandler(value = {Demo1Exception.class})
public String handleException(Demo1Exception e){
System.out.println(e.getMessage());
System.out.println("handleException 0");
return e.getMessage();
}
}
@RestControllerAdvice
适用于非视图模式,如果是视图,就是用@ControllerAdvice
,这个注解可以指定要处理的具体控制器。可以是指定某个包下的所有类,也可以是具体的控制器类。
java@RestControllerAdvice(basePackageClasses = {YourController.class})
java@RestControllerAdvice(basePackages = "com.yourpackage.controller")
@ExceptionHandler
用于定义全局或局部异常处理方法。当控制器抛出异常时,Spring会自动调用带有此注解的方法来处理异常。它可以标注在方法上,表示该方法负责处理特定类型的异常
运行结果: