拦截器和过滤器的功能比较类似,有以下区别:
过滤器是 Servlet 规范的一部分,任何框架都可以使用过滤器技术;
拦截器是 SpringMVC 框架独有的
。
过滤器配置了 /*,可以拦截任何资源;
拦截器只会对控制器中的方法进行拦截
。
1,自定义拦截器,需要实现 HandlerInterceptor
接口。
public class PrivilegeInterceptor implements HandlerInterceptor {
/**
* 预处理,controller 方法执行前
* 应用:用于身份认证、身份授权
* return true 放行,执行下一个拦截器,如果没有,执行 controller 中的方法
* return false 不放行,即不向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
/**
* 后处理方法,controller 方法执行后,方法跳转 success.jsp 执行之前
* 应用:从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/**
* success.jsp 页面执行后,该方法会执行
* 应用:统一异常处理,统一日志处理
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
2,在 springmvc.xml 中配置拦截器
<!-- 配置权限拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!--配置对那些资源进行拦截-->
<mvc:mapping path="/**"/>
<!--配置对哪些资源解除拦截操作-->
<mvc:exclude-mapping path="/user/login"/>
<bean class="com.itheima.interceptor.PrivilegeInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
举例:对未登录用户进行拦截
public class PrivilegeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断是否登录——session有没有user
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if(user==null){
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
//放行 访问目标资源
return true;
}
}