zoukankan      html  css  js  c++  java
  • Java学习之SpringMVC 拦截器

    Java学习之SpringMVC 拦截器

    0x00 前言

    继续 Spring MVC最后一点小内容,后面就该学习如何整合SSM框架了。

    0x01 拦截器

    拦截器和前面提到的一个过滤器类似,但是他们还是有些区别的。

    拦截器和过滤器区别:

    1.过滤器在任何框架都可以使用,而拦截器是Spring MVC独有的。
    
    2.过滤器配置/ * 拦截所有资源,所有静态资源都会被拦截,而拦截器只会拦截控制器的方法。
    
    

    拦截器可以用在权限验证,比如在访问后台资源的时候,经过拦截器看请求有没有进行身份验证,身份验证通过后放行,否则跳转会后台登陆页面。

    0x02 自定义拦截器

    如果我们需要定义拦截器必须实现HandlerInterceptor接口。

    HandlerInterceptor接口中三个方法的作用:

    1. preHandle方法是controller方法执行前拦截的方法
        1.1 可以使用request或者response跳转到指定的页面
        1.2 return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
        1.3. return false不放行,不会执行controller中的方法。
        
        
    2. postHandle是controller方法执行后执行的方法,在JSP视图执行前。
        2.1 可以使用request或者response跳转到指定的页面
        2.2 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
        
    3.afterCompletion方法是在JSP执行后执行
        3.1 request或者response不能再跳转页面了
    

    实现preHandle方法

    首先还是的写一个控制器

    HelloContraoller代码:

    
    
    @Controller
    @RequestMapping(path = "/user")
    public class HelloContraoller {
    
    
    
        @RequestMapping(path = "/lanjieqi")
        public String submit(){
    
            return "success";
        }
    
    
    }
    
    
    

    然后就可以自定义我们的拦截器了,让我们继承的类继承HandlerInterceptor接口,重写preHandle方法,该方法会在控制器执行前执行的方法。

    MyInterceptor代码:

    
    
    public class MyInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器执行");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return false;
        }
    
    
    }
    
    

    最后只需要把自定义的拦截器在springmvc.xml的配置文件里面配置好就行了。

    springmvc.xml:

    <mvc:interceptors>
            <mvc:interceptor>
    <!--            配置拦截器拦截路径-->
                <mvc:mapping path="/user/*"/>
    <!--            注入自定义拦截器-->
                <bean class="com.test.domain.MyInterceptor"/>
    
            </mvc:interceptor>
        </mvc:interceptors>
    

    postHandle方法实现

    public class MyInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器执行");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("控制器执行后执行");
        }
    }
    
    

    postHandle 该方法会在Controller控制器执行后进行执行。

    afterCompletion 方法实现

    
    
    public class MyInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("拦截器执行");
            request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("控制器执行后执行");
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("jsp页面执行后执行");
        }
    }
    

    该方法会在jsp执行后进行执行。

    配置多个拦截器

    <mvc:interceptors>
            <mvc:interceptor>
    <!--            配置拦截器拦截路径-->
                <mvc:mapping path="/user/*"/>
    <!--            注入自定义拦截器-->
                <bean class="com.test.domain.MyInterceptor"/>
    
            </mvc:interceptor>
            <mvc:interceptor>
                <!--            配置拦截器拦截路径-->
                <mvc:mapping path="/user/*"/>
                <!--            注入自定义拦截器-->
                <bean class="com.test.domain.MyInterceptor1"/>
    
            </mvc:interceptor>
        </mvc:interceptors>
    

    0x03 结尾

    文章完结撒花,下篇文章开始更新ssm框架的整合。

  • 相关阅读:
    数学--数论---欧拉筛 模板
    数学--数论--HDU 5019 revenge of GCD
    数学--数论--HDU 2674 沙雕题
    数学--数论--HDU 2104 丢手绢(离散数学 mod N+ 剩余类 生成元)+(最大公约数)
    数学--数论-- HDU -- 2854 Central Meridian Number (暴力打表)
    数学--数论--HDU 2197 本原串 (推规律)
    数学--数论--HDU 2582 F(N) 暴力打表找规律
    C# 命名规范
    文本分类学习 (十)构造机器学习Libsvm 的C# wrapper(调用c/c++动态链接库)
    文本分类学习 (九)SVM入门之拉格朗日和KKT条件
  • 原文地址:https://www.cnblogs.com/nice0e3/p/13614313.html
Copyright © 2011-2022 走看看