10、SpringMVC之拦截器

过滤器与拦截器的异同
共同点:功能几乎一样,都可以拦截请求进行预处理,放行等作用
区别:
(1)Filter属于Servlet技术,也就是说如果项目是JavaWeb项目就可以直接使用Filter过滤器,而拦截器是springMVC框架提供的,只有使用SpringMVC的工程才能使用它;
(2)拦截的作用域不同,Filter配置为“/*”就会拦截所有的请求,而拦截器只会拦截范围控制器方法的请求,因此过滤器作用域比拦截器大;

执行顺序如下图:

第一步、编写拦截器

编写拦截器1实现HandlerInterceptor接口


/**
 * 编写拦截器
 */
public class MyInterceptor1 implements HandlerInterceptor{
    /**
     * 预处理:controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor执行了...");

        return true;
    }

    /**
     * 不放行的情况下,利用原生API将给错误转发到错误页面
     * return false 不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("MyInterceptor执行了...");
//        request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
//        return false;
//    }

    /**
     * 后处理方法,controller方法执行后,success.jsp执行之前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
//    @Override
//    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        System.out.println("MyInterceptor执行了...后处理方法");
//    }

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

    /**
     * success.jsp页面执行后,该方法会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor执行了...最后执行");
    }
}

编写拦截器2(编写第二个拦截器是为了测试多个拦截器下的请求顺序)

/**
 * 编写拦截器
 */
public class MyInterceptor2 implements HandlerInterceptor{
    /**
     * 预处理:controller方法执行前
     * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
     * return false 不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor执行了...222");

        return true;
    }

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

    /**
     * success.jsp页面执行后,该方法会执行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor执行了...最后执行222");
    }
}

第二步、配置拦截器

配置拦截器(在springmvc配置文件中配置)

<!--配置拦截器-->
    <mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/user/*"/>
            <!--不拦截的方法-->
            <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
            <!--配置拦截器对象-->
            <bean class="com.example.interceptor.MyInterceptor1"/>
        </mvc:interceptor>
        <!--配置第二个拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体方法-->
            <mvc:mapping path="/**"/>
            <!--不拦截的方法-->
            <!--<mvc:exclude-mapping path=""></mvc:exclude-mapping>-->
            <!--配置拦截器对象-->
            <bean class="com.example.interceptor.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>

请求

<a href="user/testInterceptor">拦截器</a>

控制器

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/testInterceptor")
    public String testInterceptor() {
        System.out.println("testInterceptor执行了");

        return "success";
    }
}

响应页面

<html>
<head>
    <title>success</title>
</head>
<body>
    <% System.out.println("success.jsp执行了..."); %>
</body>
</html>
原文地址:https://www.cnblogs.com/Ryuichi/p/13388771.html