一.了解拦截器HandlerInterceptor
-
HandlerInterceptor是springMVC项目中的拦截器
-
拦截请求的地址
-
可以对请求地址做一些验证、预处理、请求响应时间等操作
-
实现一个HandlerInterceptor拦截器
二.基础入门代码编写
第一步:创建自己的拦截器
/**
* @Author Ben
* @Description 自定义拦截器
* @Date 上午10:12 2022/3/7
**/
@Component
public class MyInterceptor implements HandlerInterceptor {
/**
* 目标方法执行前,执行
* note:如果是true就进行下一步操作;若返回false,则证明不符合拦截条件,在失败的时候不会包含任何响应,此时需要调用对应的response返回对应响应。
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("调用URL:" + request.getRequestURI());
request.setAttribute("startTime",System.currentTimeMillis());
return true;
}
/**
* 目标方法执行完后,生成试图后,执行
* note:可以通过ModelAndView对视图进行处理,当然ModelAndView也可以设置为 null。
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
if (request.getRequestURI().contains("/addSession")){
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
System.out.println("当前浏览器的session:"+ name);
}
}
/**
* 目标方法完全执行完毕后,执行
* note:在 DispatcherServlet 完全处理请求后被调用,通常用于记录消耗时间,也可以对一些资源进行处理。
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long time = System.currentTimeMillis() - (long)request.getAttribute("startTime");
System.out.println("消耗总时长:"+time);
}
}
第二步:注册拦截器
/**
* @Author Ben
* @Description
* @Date 上午10:37 2022/3/7
**/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
/**
* 注册拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
第三步:接口入口
/**
* 接口入口
*/
@RestController
@RequestMapping({"/entry"})
public class TestEntry {
@RequestMapping("/addSession")
public void addSession(HttpServletRequest request) {
request.getSession().setAttribute("name","Ben");
}
}
第四步:启动服务,测试
- note:
- 红色区域,是拦截器的测试结果
- 绿色区域,是之前AOP的代码,此处没去掉,可以发现,拦截器的范围要大于AOP