自定义拦截器中不能使用自定义异常(不能用声明式异常) 因为当拦截器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>