SpringMVC 中的 Interceptor 拦截器,它的主要作用是 拦截指定的用户请求,并进行相应的预处理与后处理。 其拦截的时间点在处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前。当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。

该方法在处理器方法执行之前执行。其返回值为 boolean,若返回值为 true,则放行该请求,接着会执行处理器方法。若返回值为false,则该请求会被拦截。
该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。
当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。
package com.user;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断用户是否登陆过
if (request.getSession().getAttribute("username") == null){
//用户未登录过,则转发到登录界面,并给出提示
request.setAttribute("msg","您还没有登陆,请先登录");
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp");
return false;//不放行
}
return true;//放行
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/login"/>
<mvc:exclude-mapping path="/loginValid"/>
<bean class="com.user.LoginInterceptor"/>
mvc:interceptor>
mvc:interceptors>