SpringMVC-自定义拦截器

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

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/80087722