zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    小程序入门
    页面滚动触底加载
    js取整
    【Codeforces 1389D】Segment Intersections
    【Codeforces 1385 E】Directing Edges
    【Codeforces 1369D】TediousLee
    【Codeforces Global Round 9 D】Replace by MEX
    【Codeforces Global Round 9 C】Element Extermination
    【Codeforces Round #639 (Div. 2) A】Puzzle Pieces
    【Codeforces Round #639 (Div. 2) B】Card Constructions
  • 原文地址:https://www.cnblogs.com/bi-hu/p/15012287.html
Copyright © 2011-2022 走看看