SpringMVC-17-拦截器参数
拦截器代码样例:
@Component
public class ProjectInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
// 刷新请求中所有的 cookie 寿命,再加入到响应中
Cookie[] cookies = request.getCookies();
if (cookies != null) for (Cookie cookie : cookies) {
cookie.setMaxAge(60 * 60 * 24 * 7);
response.addCookie(cookie);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
// 获取原始的 Controller 方法
HandlerMethod hm = (HandlerMethod) handler;
Method method = hm.getMethod();
System.out.println("原始方法:" + method.getDeclaringClass() + "." + method.getName());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion...");
// 打印处理器执行过程中出现的异常
System.out.println("出现的异常:" + ex);
if (ex != null)
ex.printStackTrace();
}
}
1、参数 request 与 response
request 和 response 分别表示请求与响应,拦截器的三个方法中都存在这两个参数,类型是 HttpServletRequest 和 HttpServletResponse,就是 Servlet 里的请求与响应,可以进行 Servlet 原始操作,比如进行 Cookie 的读取与添加等操作
值得注意的是,只有在 preHandle 方法中对 response 的操作才会响应给客户端,postHandle 和 afterCompletion 方法则不会
2、参数 handler
handler 参数类型是 Object,但实际上是 HandlerMethod 类,三个方法中都存在这个参数,是对原始的 Controller 方法进行的封装,通过 handler 调用 getMethod() 函数可以得到原始方法
3、参数 modelAndView
类型是 ModelAndView,只存在于 postHandle 方法中,如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整
4、参数 ex
类型是 Exception,只存在于 afterCompletion 方法中,表示处理器执行过程中出现的异常对象,可以针对异常情况进行单独处理,SpringMVC 中有专门的异常处理器,所以此处不常用