springmvc拦截器
配置springmvc
<mvc:interceptors>
<!-- 使用 bean声明定义一个Interceptor,但是如果是直接定义在 mvc:interceptors 下面的 Interceptor将会拦截所有的请求 -->
<!--<bean class="com.xxx.xxx.AuthorityInterceptor"/> -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xieli.liu.interceptor.HandleInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xieli.liu.interceptor.HandleInterceptor2"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.xieli.liu.interceptor.HandleInterceptor3"/>
</mvc:interceptor>
</mvc:interceptors>
创建拦截器实现类
package com.xieli.liu.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Administrator on 2019-12-06.
*/
public class HandleInterceptor1 implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("HandleInterceptor1"+"...............preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("HandleInterceptor1"+"...............postHandle");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("HandleInterceptor1"+"...............afterCompletion");
}
}
package com.xieli.liu.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Administrator on 2019-12-06.
*/
public class HandleInterceptor2 implements HandlerInterceptor{
//handle执行前,常用权限验证
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("HandleInterceptor2"+"...............preHandle");
return true;
}
//handlef返回之前,对ModelAndView处理
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("HandleInterceptor2"+"...............postHandle");
}
//handle执行后,常用同一异常处理,同一日志处理
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("HandleInterceptor2"+"...............afterCompletion");
}
}
package com.xieli.liu.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by Administrator on 2019-12-06.
*/
public class HandleInterceptor3 implements HandlerInterceptor{
//handle执行前,常用权限验证
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("HandleInterceptor3"+"...............preHandle");
return true;
}
//handlef返回之前,对ModelAndView处理
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("HandleInterceptor3"+"...............postHandle");
}
//handle执行后,常用同一异常处理,同一日志处理
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("HandleInterceptor3"+"...............afterCompletion");
}
}
测试
测试所有拦截器放行时
结论:preHandle顺序执行,postHandle和afterCompletion逆序执行
拦截器3不放行
结论:所有postHandle都不执行,拦截器3 afterCompletion不执行
拦截器1不放行
结论:只有拦截器1 preHandle执行
拦截器应用
1.同一日志处理:放在第一个拦截器并且一定要放行。
2.登陆认证:放在第一个拦截。
3.权限校验:放在登陆认证拦截器的后面。