SpringMVC拦截器

100 阅读2分钟

介绍

SpringMVC拦截器类似于Servlet开发中的过滤器Filter,它可以对处理器进行预处理和后处理。

拦截器与过滤器的区别

(1)任何java web工程都可使用过滤器,而拦截器只有SpringMVC框架的工程才可使用;

(2)过滤器可以通过url-pattern配置成/*后对所有要访问的资源进行拦截,而拦截器只能拦截访问的控制器方法,jsp,html,css,js等是不会被拦截的。

预处理

允许放行示例

自定义拦截器类

public class MyInterceptor implements HandlerInterceptor {
    /*
        执行前控制层方法 先执行预处理方法
        返回true表示放行,执行下一个拦截i去,若没有拦截器则执行控制层方法
        返回false表示不放心,可通过request或response进行页面跳转
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行");
//        return true;
        request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
        return false;
    }
}

在springmvc.xml配置拦截器

<!--    配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            设置具体要拦截的方法,此处拦截Intercept下的所有方法-->
            <mvc:mapping path="/Intercept/**"/>
            <bean class="com.on1.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

控制层类

@Controller
@RequestMapping("/Intercept")
public class InterceptController {
    @RequestMapping("/testIntercept")
    public String testIntercept() {
        System.out.println("testIntercept方法执行");
        return "success";
    }
}

请求链接:

<a href="Intercept/testIntercept">测试拦截方法</a>

点击链接后的页面:

控制台输出:

不允许放行示例

修改下preHandle方法:

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行");
        request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
        return false;
    }

点击链接后页面:

控制台输出:

后处理

postHandle方法:在控制层方法执行完逻辑并要跳转页面之前执行该方法。 示例

拦截器类

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行");
        return true;
    }

    /*
         当控制层类方法testIntercept执行完且要跳转到success页面之前执行postHandle方法
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法执行");
        request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
    }
}

点击链接后页面为:

控制台输出:

完成后

afterCompletion方法:在控制层方法执行完逻辑并跳转页面后,执行该方法,主要用于回收资源。

示例

拦截器类

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle方法执行");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle方法执行");
        request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion方法执行");
    }
}

点击链接后页面为:

控制台输出:

注:若注释掉postHandle方法中跳转到error页面的语句,则最终是跳到success页面。