拦截器的配置步骤
- springmvc.xml中配置多个拦截器
- .配置自定义拦截器并实现接口
<!--配置SpringMVC拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean id="myInterceptor2" class="com.czh.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!--配置要拦截的具体方法-->
<mvc:mapping path="/user/*"/>
<!--不要拦截的方法-->
<!-- <mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean id="myInterceptor" class="com.czh.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
- 拦截器1和2,内容都一样只是打印数据不一样 拦截器二打印的都是2222
package com.czh.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author zhCoding
* @Description:
* @create 22:04
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* 预处理,controller 方法执行前
* return true 放行,执行下一个拦截器
* return false 不放行,可以考虑跳转到提示页面
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle拦截器执行了1111...");
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username);
if ("123".equals(username)&&"123".equals(password))
return true;
request.setAttribute("msgg","用户不正确!");
request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
return false;
}
/**
* 后处理方法,controller方法执行后会执行这个方法
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle拦截器执行了1111...");
System.out.println(modelAndView.getModel());
System.out.println("**************");
System.out.println(modelAndView.getModelMap());
System.out.println(modelAndView.getStatus());
System.out.println(modelAndView.getViewName());
System.out.println(modelAndView.getView());
}
/**
* 跳转等页面操作执行后,执行此方法 可以关闭流等
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion执行了1111....");
}
}
执行结果:
- 但如果把两个拦截器顺序跳转
- 将username参数设置为不正确,即让preHandle返回false
- 所以
- 总结执行顺序:
- preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用
postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用