Java Spring 之拦截器HandlerInterceptor详解与实战
目录
- 一、拦截器的作用
- 1.1 请求处理前的拦截
- 1.2 请求处理后的拦截
- 1.3 请求完成后的拦截
- 二、创建拦截器
- 2.1 实现 `HandlerInterceptor` 接口
- 2.2 注册拦截器
- 三、拦截器的使用场景
- 3.1 权限校验
- 3.2 日志记录
- 3.3 性能监控
- 四、总结
在 Spring 框架中,拦截器(
HandlerInterceptor
)是一种强大的机制,用于在请求处理之前、之后以及请求完成之后执行代码。拦截器可以用于实现诸如权限校验、日志记录、性能监控等功能。本文将详细介绍 Spring 拦截器的使用方法,并提供具体的代码示例。
一、拦截器的作用
1.1 请求处理前的拦截
在请求到达控制器方法之前,拦截器可以执行一些前置操作,例如校验用户是否登录、记录请求时间等。
1.2 请求处理后的拦截
在控制器方法执行完毕后,拦截器可以执行一些后置操作,例如修改响应内容、记录处理时间等。
1.3 请求完成后的拦截
在请求完全处理完毕后,拦截器可以执行一些清理操作,例如释放资源、记录日志等。
二、创建拦截器
2.1 实现 HandlerInterceptor
接口
创建一个类实现 HandlerInterceptor
接口,并重写其方法。
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 {// 在请求处理之前执行@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle: 请求处理之前");// 返回 true 表示继续执行后续的拦截器或控制器方法,返回 false 表示中断执行return true;}// 在请求处理之后执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle: 请求处理之后");}// 在请求完成之后执行@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion: 请求完成之后");}
}
2.2 注册拦截器
在 Spring 配置中注册创建的拦截器。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate MyInterceptor myInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/**") // 指定拦截的路径.excludePathPatterns("/static/**", "/error"); // 指定不拦截的路径}
}
三、拦截器的使用场景
3.1 权限校验
在用户请求到达控制器之前,校验用户是否有权限访问该资源。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Object user = request.getSession().getAttribute("user");if (user == null) {// 如果用户未登录,重定向到登录页面response.sendRedirect(request.getContextPath() + "/login");return false;}return true;
}
3.2 日志记录
记录请求的详细信息,包括请求时间、请求路径、响应时间等。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);return true;
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();System.out.println("请求路径:" + request.getRequestURI() + ",处理时间:" + (endTime - startTime) + "ms");
}
3.3 性能监控
对请求的处理时间进行监控,分析系统的性能瓶颈。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);return true;
}@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();long responseTime = endTime - startTime;System.out.println("请求路径:" + request.getRequestURI() + ",响应时间:" + responseTime + "ms");// 根据响应时间进行性能分析和警告
}
四、总结
通过实现 HandlerInterceptor
接口并重写其方法,我们可以创建自定义的拦截器。然后在 Spring 配置中注册拦截器并指定其拦截路径,就可以在请求的各个阶段执行自定义逻辑。拦截器在权限校验、日志记录、性能监控等场景中有着广泛的应用。希望本文的示例和讲解能够帮助你更好地理解和使用 Spring 拦截器。