目录
SpringbootInterceptorApplication启动类
在开发SpringBoot项目时,开发人员经常需要对HTTP请求进行拦截和处理,以实现诸如身份验证、授权、日志记录等功能。为了实现这些功能,Spring Boot提供了过滤器和拦截器这两个工具。此外,开发人员还需要使用SpringBoot中的监听器监听SpringBoot项目中的特定事件,以实现统计网站访问量、记录用户访问路径、系统启动时加载初始化信息等功能。
拦截器(Interceptor)
- SpringBoot的拦截器用于拦截用户请求并做相应的处理。例如验证用户是否登录、日志记录、权限管理等。
- 拦截器可以在控制器类中的方法被执行前和被执行后对请求做一些处理
- 实现拦截器,主要是实现HandlerInterceptor接口,该接口有三大方法:
- preHandle():方法执行前,处理请求时
- postHandle():方法执行后,处理请求时
- afterCompletion():请求结束后
- 过滤器与拦截器的主要区别在于触发的时机不同
项目总结
- 该项目的目的在于拦截请求,让请求进入控制器类的一个方法,并读取请求中的value参数的值,在控制器类处理完请求后,再次拦截请求,查看请求中value参数值是否发生变化
- 前后发生了变化,证明拦截器成功拦截了请求,并指使它干了某些事
新建一个SpringBoot项目
项目结构:
MyInterceptor自定义拦截器
package com.study.springboot_interceptor.intercepter;
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
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 {
/**
* preHandle()方法会在控制器类中的方法被执行之前,对请求进行处理时被执行
* @param request 请求对象
* @param response 响应对象
* @param handler 请求的处理程序对象
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
if(handler instanceof HandlerMethod){//如果是HandlerMethod对象
HandlerMethod method=(HandlerMethod) handler;
//通过handler对象的类型知晓请求将进入控制器类中的哪个方法
System.out.println("(1)请求访问控制器类中的方法是:"+method.getMethod().getName()+"()");
Object value=request.getAttribute("value");//读取请求的某个属性,默认为null
System.out.println(" 执行方法前:value="+value);
return true;
}
return false;
}
//postHandle()方法会在控制器类中的方法被执行之后,对请求进行处理时被执行
public void postHandle(HttpServletRequest request, HttpServletResponse response,Object handler,
@Nullable ModelAndView modelAndView){
Object value=request.getAttribute("value");//执行完请求,再读取此属性
System.out.println("(2)执行方法后:value="+value);
}
//afterCompletion()方法会在整个请求结束之后被执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler,
@Nullable Exception ex){
request.removeAttribute("value");//执行完请求,再读取此属性
System.out.println("(3)整个请求都执行完毕,在此做一些资源释放工作");
}
}
InterceptorConfig配置类
package com.study.springboot_interceptor.config;
import com.study.springboot_interceptor.intercepter.MyInterceptor;
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;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry){
InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
registration.addPathPatterns("/**");//拦截所有路径,/**表示匹配多层地址
}
}
InterceptorController控制器
package com.study.springboot_interceptor.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class InterceptorController {
@RequestMapping("/index")
public String index(){
return "欢迎访问XXX网站";
}
@RequestMapping("/login")
public String login(HttpServletRequest request){
request.setAttribute("value","登录前在此保存了一些属性值");//向请求中插入一个属性值
return "请先登录";
}
}
SpringbootInterceptorApplication启动类
package com.study.springboot_interceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootInterceptorApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootInterceptorApplication.class, args);
}
}
- 启动项目,依次访问网址
- http://localhost:8080/index
- http://localhost:8080/login
- 访问第二个网址时,请求被login()方法处理后,value参数就有了新值