自定义拦截器中不能使用自定义异常(不能用声明式异常) 因为当拦截器return false 的时候SpringMVC的DispatcherServlet就不会走if(exception != null)这个方法,SpringMVC 不会去处理拦截器抛出的异常
①创建一个类,实现HandlerInterceptor接口
--| preHandle():在目标handler方法执行之前调用
return true:执行后续操作(执行handler方法)
return false:不执行后续操作(不执行handler方法)
--| postHandle():在目标handler方法执行之后,渲染视图之前 调用
--| afterCompletion():在渲染视图之后
public class LoginIntecepter implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
//1.从request对象中获取servletPath
String servletPath = request.getServletPath();
System.out.println("servletPath="+servletPath);
//2.检查当前servletPath是不是要保护的资源
Set<String> publicResourceSet = new HashSet<>();
publicResourceSet.add("/toLoginUI");
publicResourceSet.add("/login");
if(publicResourceSet.contains(servletPath)) {
//3.如果是不需要登录的资源,则直接放行
return true;
}
//4.检查登录状态
//①获取Session对象
HttpSession session = request.getSession();
//②从Session域中获取登录信息
Object login = session.getAttribute("loginUser");
//③判断
if(login == null) {
//6.如果没有登录,则跳转到登录页面,并显示提示消息
request.setAttribute("message", "请登录后再操作!");
request.getRequestDispatcher("/WEB-INF/user/login.jsp").forward(request, response);
//7.不放行
return false;
}else{
//8.如果已经登录,则放行
return true;
}
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {}
}
②注册拦截器
<!-- 注册自定义拦截器类 -->
<!-- 默认拦截所有handler请求的配置方式 -->
<mvc:interceptors>
<!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
<mvc:mapping path="/callBack/**" />
<bean class="com.atguigu.myinter.interceptor.LoginIntecepter"/>
</mvc:interceptors>
<!--配置多个拦截器 -->
<mvc:interceptors>
<!-- 指定不拦截的资源 -->
<mvc:interceptor>
<mvc:mapping path="/*"/>
<mvc:exclude-mapping path="/otherContent"/> <!--指定不拦截的资源 -->
<bean class="com.atguigu.myinter.interceptor.LoginIntecepter"/>
</mvc:interceptor>
<bean class="com.atguigu.myinter.interceptor.ThirdInterceptor"/>
<bean class="com.atguigu.myinter.interceptor.SecondInterceptor"/>
<bean class="com.atguigu.myinter.interceptor.FirstInterceptor"/>
</mvc:interceptors>