拦截器
拦截器的原理和过滤器相同。
SpringMVC:要想实现拦截器,必须实现一个接口HandlerInterceptor
a.编写拦截器implements HandlerInterceptor
public class MyInterceptor implements HandlerInterceptor{
//请求前拦截
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
Object user = request.getSession().getAttribute(Global.USER_SESSION_KEY);
if (user == null) {
System.out.println("尚未登录,调到登录页面");
response.sendRedirect("/loginpage.html");
return false;
}
return true;//true:拦截操作之后,放行 ;false:拦截之后不放行,请求终止;
}
//响应前拦截
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("拦截响应");
}
//渲染前拦截
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("视图(jsp)被渲染完毕");
}
}
b.配置:将自己写的拦截器 配置到springmvc中(spring)
<!-- 将拦截器 配置到springmvc中(spring);默认拦截全部请求 -->
<mvc:interceptors>
<!-- 配置具体的拦截路径 -->
<mvc:interceptor>
<!-- 指定拦截的路径,基于ant风格 -->
<mvc:mapping path="/**"/>
<!-- 指定拦不截的路径 -->
<mvc:exclude-mapping path="/handler/testUpload"/>
<bean class="org.lanqiao.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
<!-- 配置具体的拦截路径 -->
<mvc:interceptor>
<!-- 指定拦截的路径,基于ant风格 -->
<mvc:mapping path="/**"/>
<!-- 指定不拦截的路径 -->
<mvc:exclude-mapping path="/handler/testUpload"/>
<bean class="org.lanqiao.interceptor.MySecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 将拦截器配置到springmvc中-->
<mvc:interceptors>
<!-- 配置具体的拦截路径 -->
<mvc:interceptor>
<!-- 指定拦截的路径,基于ant风格 -->
<mvc:mapping path="/**"/>
<!-- 指定拦不截的路径 -->
<mvc:exclude-mapping path="/api/v1/login"/>
<bean class="uitil.LoginFilter"></bean>
</mvc:interceptor>
</mvc:interceptors>
如果有多个拦截器,则每个拦截器的preHandle postHandle 都会在相应时机各被触发一次;但是afterCompletion, 只会执行最后一个拦截器的该方法。