SpringMVC拦截器配置及运行流程解析
前言
在 SpringMVC 中,拦截器是非常重要的一个组件之一,它可以拦截来自浏览器的请求并进行相应的处理,如登录认证、日志记录、性能监控等。本文将详细阐述 SpringMVC 拦截器的配置及运行流程,并提供两条示例说明,帮助读者更好地理解和应用拦截器。
拦截器的配置
在 SpringMVC 中,拦截器的配置是通过实现 HandlerInterceptor 接口来实现的。该接口包括三个方法:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
其中,preHandle() 方法在请求处理之前被调用,用于进行一些前置处理,如身份认证等。postHandle() 方法在请求处理之后被调用,用于进行一些后置处理,如添加视图等。afterCompletion() 方法在请求完成后被调用,用于进行一些清理工作。
要配置拦截器,需要在 SpringMVC 的配置文件中添加如下代码:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.example.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
说明:
<mvc:interceptors>
表示添加拦截器<mvc:mapping>
定义拦截路径,如上例中表示拦截所有请求<bean>
定义拦截器的实现类,如上例中为 com.example.interceptor.MyInterceptor 类
拦截器的运行流程
在 SpringMVC 中,拦截器的运行流程如下:
- DispatcherServlet 收到请求;
- 遍历所有拦截器;
- 如果当前拦截器的 preHandle() 方法返回 false,则直接结束请求,并回传给浏览器相应的错误信息;
- 如果当前拦截器的 preHandle() 方法返回 true,则执行下一个拦截器,直到所有拦截器都执行完毕;
- 请求处理器逐层调用,执行请求处理逻辑;
- 遍历所有拦截器;
- 如果当前拦截器的 postHandle() 方法存在,则执行该方法;
- 请求处理后返回响应内容给浏览器;
- 遍历所有拦截器;
- 如果当前拦截器的 afterCompletion() 方法存在,则执行该方法。
示例一
以下代码是一个简单的拦截器实现类,用于检查用户是否已经登录:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(true);
if(session.getAttribute("user")==null){
response.sendRedirect(request.getContextPath()+"/user/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// do nothing
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// do nothing
}
}
以上代码中,preHandle() 方法会检查用户是否已经登录,如果用户未登录则重定向到登录界面。如果已登录,则返回 true,继续执行其他的拦截器和请求处理器。示例中的 postHandle() 和 afterCompletion() 方法为空实现。
示例二
以下代码是一个拦截器实现类,用于统计请求时间:
public class TimeInterceptor implements HandlerInterceptor {
private ThreadLocal<Long> startTime = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
startTime.set(System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long costTime = System.currentTimeMillis() - startTime.get();
String url = request.getRequestURL().toString();
String method = request.getMethod();
System.out.println(String.format("request url:%s, method:%s, cost:%d ms", url, method, costTime));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// do nothing
}
}
以上代码中,preHandle() 方法会记录请求开始时的时间,postHandle() 方法会计算请求处理时间,并打印相关信息。
总结
本文详细讲解了 SpringMVC 拦截器的配置及运行流程,并提供了两条示例说明。拦截器在 SpringMVC 中扮演着非常重要的角色,它能够对请求进行拦截和处理,增强 Web 应用的安全性、性能和可维护性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC拦截器配置及运行流程解析 - Python技术站