15 SpringMVC 拦截器

拦截器(interceptor)的作用

Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方 法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现

拦截器和过滤器区别


自定义拦截器很简单,只有如下三步:

① 创建拦截器类实现HandlerInterceptor接口

② 配置拦截器

③ 测试拦截器的拦截效果

下面直接上代码 然后我们在注释里面讲解即可:

第一步 ① 创建拦截器类实现HandlerInterceptor接口

package com.bihu;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//第一步 创建类 然后实现HandlerIntercepto接口{有兴趣可以去看看底层代码}
public class MyHandlerInterceptor implements HandlerInterceptor {

    //在拦截前执行这个方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /***
         * 这个方法返回一个布尔型的值,若true则都执行下面的方法 post 和 after
         * 如果返回值是false ,那么返回的只执行这个方法,不执行下面方法。
         */
        System.out.println("我是preHandle 方法  我在拦截前执行");
        return false;       //如果我返回的是false  下面的方法都不执行
    }

    //在控制器执行方法后返回视图前(数据未发送出去)执行这个方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("我是postHandle方法 上面的preHandle 返回true 了 我执行了");
    }

    //在控制器什么都执行完之后才执行这个方法
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("我是afterCompletion方法,我是控制器方法全部执行后(视图也返回了) 我执行了!");
    }
}

然后 配置一下 让MVC知道有这么个东西

<!-- 配置拦截器 【用mvc标签interceptors】 加了个s 证明复数-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--下面的/** 表示拦截所有的控制器(访问) ,bean是一个参数 地址是你设置的拦截器-->
        <mvc:mapping path="/**"/>
        <bean class="com.bihu.MyHandlerInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

然后测试一下 看下拦截器 preHandle返回的是真的时候 就可以访问全部,返回false 那么就拦截掉了:

package com.bihu.Controller;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

public class TestController {

    @RequestMapping("/show")
   public String show(Model model){
    model.addAttribute("data","成功返回 未被拦截!");
    return "TestJSP";
    }

}

然后结果如下:

1. 当拦截器 pre方法返回false ,只执行pre方法,然后访问的页面空白。(逻辑上你可以给个提示 说权限)

2. 如果返回true,都执行,然后也正常跳转 相当于没有拦截器一样。

成功运行:

注意一个点!  拦截器只拦截控制器的方法,如果是页面首页那些直接访问jsp的(除了绑定在控制器中返回的JSP) 不会拦截的!! 注意这个点 千万了啊! 所以你一般吧不空开的视图放到web-inf....

在写登录的时候 拦截权限 其他都拦截/**  但是不拦截登录的请求 那么就是 

<!--   配置拦截器   -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/user/login"/>
            <bean class="com.bihu.Interceptor.jurisdiction"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

其实就是这个标签:

<mvc:exclude-mapping path="/user/login"/>

可以理解为放行标签【不拦截】

本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/15012287.html

原文地址:https://www.cnblogs.com/bi-hu/p/15012287.html