• SpringMVC拦截器


    1 拦截器(interceptor)的作用

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

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

    2 拦截器和过滤器的区别

    3 自定义拦截器

    (1)创建拦截器类实现HandlerInterceptor接口

    (2)配置拦截器(spring-mvc.xml中配)

    (3)测试拦截器的拦截效果

    4 拦截器方法说明

     案例:页面初始的情况

     pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.company</groupId>
        <artifactId>spring_interceptor</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <packaging>war</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.0.5.RELEASE</version>
            </dependency>
        </dependencies>
    
    </project>

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <!--配置springmvc的前端控制器-->
        <servlet>
            <servlet-name>DispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>

    spring-mvc.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/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    ">
    
        <!-- 1、mvc注解驱动-->
        <mvc:annotation-driven/>
        <!-- 2、配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 3、静态资源权限开放-->
        <mvc:default-servlet-handler/>
        <!-- 4、组件扫描,扫描Controller-->
        <context:component-scan base-package="com.company.controller"/>
    
    </beans>

    index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <p>ssssssdss!!!${name}</p>
    </body>
    </html>
    

    TargetController.java

    package com.company.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    public class TargetController {
        @RequestMapping("/target")
        public ModelAndView show() {
            System.out.println("目标资源执行...");
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("name", "company");
            modelAndView.setViewName("index");
            return modelAndView;
        }
    }
    

     浏览器中

    下面来看看加入拦截器的案例

     MyInterceptor1.java

    package com.company.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 {
        // 在目标方法执行之前 执行
        public boolean preHandle(javax.servlet.http.HttpServletRequest request,
            javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle....");
            return true;
        }
    
        // 在目标方法执行之后 视图返回之前执行
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle....");
        }
    
        // 在整个流程都执行完毕后 执行
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
            System.out.println("afterCompletion....");
        }
    }
    

      在spring-mvc.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/context http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    ">
    
        <!-- 1、mvc注解驱动-->
        <mvc:annotation-driven/>
        <!-- 2、配置视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!-- 3、静态资源权限开放-->
        <mvc:default-servlet-handler/>
        <!-- 4、组件扫描,扫描Controller-->
        <context:component-scan base-package="com.company.controller"/>
        <!-- 配置拦截器-->
        <mvc:interceptors>
            <mvc:interceptor>
            <!--对那些资源执行拦截操作,/** 代表对所有的资源执行拦截-->
                <mvc:mapping path="/**"/>
                <bean class="com.company.interceptor.MyInterceptor1"/>
            </mvc:interceptor>
        </mvc:interceptors>
    
    </beans>

    pom.xml添加servlet依赖

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.company</groupId>
        <artifactId>spring_interceptor</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <packaging>war</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.0.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.2.1</version>
            </dependency>
        </dependencies>
    
    </project>

    在浏览器中输入

     看控制台上打印

     注意:

     下面配置拦截后转发到另外一个页面上error.jsp

    package com.company.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 {
        // 在目标方法执行之前 执行
        public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle....");
            String param = request.getParameter("param");
            if ("yes".equals(param)) {
                return true;
            } else {
                request.getRequestDispatcher("error").forward(request, response);
                return false;
            }
    
        }
    
        // 在目标方法执行之后 视图对象返回之前执行
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
            modelAndView.addObject("name", "wwhhdhd");
            System.out.println("postHandle....");
        }
    
        // 在整个流程都执行完毕后 执行
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
            System.out.println("afterCompletion....");
        }
    }
    

     

      

  • 相关阅读:
    一文看懂Python匿名函数
    Python数据分析库之pandas,你该这么学!No.1
    探究以太坊 2.0 的分叉选择规则
    Plasma 设计综合列表
    从比特币到 Polkadot
    Ethereum Plasma MVP and Plasma Cash
    Java程序员进阶路线-高级java程序员养成
    matlab混合编程向导(vc,vb,.net...)
    matlab混合编程向导(vc,vb,.net...)
    matlab混合编程向导(vc,vb,.net...)
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14246327.html
Copyright © 2020-2023  润新知