定义拦截器
实现HandlerInterceptor接口
public class HandlerInterceptor1 implements HandlerInterceptor {
//进入Handler方法后执行
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
//进入Handler方法后,返回modelandview之前执行
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
//执行handler完成前执行,此方法
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
// TODO Auto-generated method stub
return false;
}
}
拦截器配置
针对handlermapping进行配置
springmvc拦截器针对HandlerMapping进行拦截配置。 如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的handler最终使用该拦截器。
(不推荐使用)
<bean class="org.springframework.web.servlet.Handler.BeanNameUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="handlerInterceptor1" />
<ref bean="handlerInterceptor2" />
</list>
</property>
</bean>
<bean id="handlerInterceptor1" class="com.itcast.filter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="com.itcast.filter.HandlerInterceptor2"/>
针对全局进行配置
springmvc配置类似全局的拦截器,springmvc框架将配置的类似的全局的拦截器注入到每个handlerMapping中。
在springmvc.xml文件中添加
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean calss="com.itcast.filter.HandlerInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
拦截器测试
全局配置两个拦截器
两个拦截器都放行
H1 ...preHandle
H2...preHandle
H2...postHandle
H1...postHandle
H2...afterCompletion
H1...afterCompletion
根据测试结果总结!
preHandler方法按顺序执行
postHandler和afterCompletion安拦截器配置的逆向顺序执行
拦截器1放行,拦截器2不放行
H1...preHandle
H2...preHandle
H1...afterCompletion
对拦截器应用
比如:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。
比如:登录认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登录认证拦截器后。(因为登录后才能认证)。
实现登录认证
1 用户请求url
2 拦截器进行拦截校验
如果请求的url是公开地址(无需登录即可访问的url)放行。
如果用户session不存在跳转到登录页面
如果用户session存在放行,继续操作