zoukankan      html  css  js  c++  java
  • SpringMVC框架中的拦截器

    SpringMVC框架中的拦截器

    拦截器的概述

    1 .SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术

    2 .可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链 中的拦截器会按着定义的顺序执行。

    3 .拦截器和过滤器的功能比较类似,有区别

    ​ 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。

    ​ 拦截器是SpringMVC框架独有的。

    ​ 过滤器配置了/*,可以拦截任何资源。

    ​ 拦截器只会对控制器中的方法进行拦截。

    4 .拦截器也是AOP思想的一种实现方式

    5 .想要自定义拦截器,需要实现HandlerInterceptor接口。

    自定义拦截器步骤

    创建类,实现HandlerInterceptor接口,重写需要的方法

    第一个拦截器:

    package cn.itcast.controller.cn.itcast.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 自定义拦截器
     */
    public class MyInterceptor1 implements HandlerInterceptor{
    
        /**
         * 预处理,controller方法执行前
         * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
         * return false不放行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor1执行了...前1111");
            // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return true;
        }
    
        /**
         * 后处理方法,controller方法执行后,success.jsp执行之前
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("MyInterceptor1执行了...后1111");
            // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("MyInterceptor1执行了...最后1111");
        }
    
    }
    

    第二个拦截器

    package cn.itcast.controller.cn.itcast.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * 自定义拦截器
     */
    public class MyInterceptor2 implements HandlerInterceptor{
    
        /**
         * 预处理,controller方法执行前
         * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
         * return false不放行
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("MyInterceptor1执行了...前2222");
            // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
            return true;
        }
    
        /**
         * 后处理方法,controller方法执行后,success.jsp执行之前
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("MyInterceptor1执行了...后2222");
            // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        }
    
        /**
         * success.jsp页面执行后,该方法会执行
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("MyInterceptor1执行了...最后2222");
        }
    
    }
    

    UserController.java

    package cn.itcast.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    @RequestMapping("/user")
    public class UserController {
    
    
        @RequestMapping("/testInterceptor")
        public String testInterceptor(){
            System.out.println("testInterceptor执行了...");
            return "success";
        }
    
    }
    

    在springmvc.xml中配置拦截器类

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!-- 开启注解扫描 -->
        <context:component-scan base-package="cn.itcast"/>
    
        <!-- 视图解析器对象 -->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--前端控制器,哪些静态资源不拦截-->
        <mvc:resources location="/css/" mapping="/css/**"/>
        <mvc:resources location="/images/" mapping="/images/**"/>
        <mvc:resources location="/js/" mapping="/js/**"/>
    
        <!--配置拦截器-->
        <mvc:interceptors>
            <!--配置拦截器-->
            <mvc:interceptor>
                <!--要拦截的具体的方法-->
                <mvc:mapping path="/user/*"/>
                <!--不要拦截的方法
                <mvc:exclude-mapping path=""/>
                -->
                <!--配置拦截器对象-->
                <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor1" />
            </mvc:interceptor>
    
            <!--配置第二个拦截器-->
            <mvc:interceptor>
                <!--要拦截的具体的方法-->
                <mvc:mapping path="/**"/>
                <!--不要拦截的方法
                <mvc:exclude-mapping path=""/>
                -->
                <!--配置拦截器对象-->
                <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor2" />
            </mvc:interceptor>
        </mvc:interceptors>
    
        <!-- 开启SpringMVC框架注解的支持 -->
        <mvc:annotation-driven />
    
    </beans>
    

    HandlerInterceptor接口中的方法

    有三种方法

    1. preHandle方法是controller方法执行前拦截的方法

      1. 可以使用request或者response跳转到指定的页面
      2. return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
      3. return false不放行,不会执行controller中的方法。
    2. postHandlecontroller方法执行后执行的方法,在JSP视图执行前。

      1. 可以使用request或者response跳转到指定的页面
      2. 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
    3. postHandle方法是在JSP执行后执行

      request或者response不能再跳转页面了

  • 相关阅读:
    iOS—UI —推送实现
    iOS—UI —懒加载
    iOS多线程和NSRunLoop概述
    ios安全性---AES加密
    iOS私有API
    iOS多线程 && Runloop
    iOS毛玻璃效果
    Swift -4-对象与类
    Swift -3-函数&闭包
    Swift -1- 简介&简单值&基本类型
  • 原文地址:https://www.cnblogs.com/Lilwhat/p/12605522.html
Copyright © 2011-2022 走看看