拦截器:
一般的拦截器需要实现HandlerInterceptor 接口,如果拦截器功能简单,可以直接继承springmvc实现好的类HandlerInterceptorAdapter。
package com.anlysqx.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class Interceptor2 extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("interceptor2...after");
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("interceptor2...post");
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("interceptor2...pre");
System.out.println(request.getRequestURI());
if(!request.getRequestURI().equals("/path/2")){
request.getRequestDispatcher("/path/2").forward(request, response);
return false;
}
return true;
}
}
对于多个拦截器,执行顺序是根据在springmvc.xml中配置的顺序来定:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.anlysqx.interceptor.Interceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.anlysqx.interceptor.Interceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
执行顺序,pre按照xml配置顺序,post和after按照逆序,post在前,after在后
如果某个拦截器的pre返回false那么其post,after,以及后面的所有拦截器均不执行。
一般日志记录在第一个拦截器中,而且必须要放行。
对于登录验证拦截器,需要在pre中返回false,同时重定向到首页。