SSM笔记-SpringMVC的自定义拦截器

1、步骤
①创建拦截器类,并为该类实现HandlerInterceptor接口及其实现方法
②在springmvc配置文件中配置mvc:interceptors和mvc:annotation-driven
③测试运行handler即可看到效果

2、自定义拦截器运行顺序
①按照mvc:interceptors配置的bean顺序运行
②配置的拦截器的preHandle方法
③被调用的handler方法
④配置的拦截器的postHandle方法
⑤配置的拦截器的afterCompletion方法

3、注意事项:
①不管spring配置文件中配置了mvc:mapping或者mvc:exclude-mapping, preHandle方法都需要执行
②mvc:mapping一定要写在mvc:exclude-mapping前面
③mvc:exclude-mapping不能单独存在,必须要有mvc:mapping在前面,不然会报错“500 - Servlet.init() for servlet springDispatcherServlet threw exception”
④mvc:interceptors下的bean配置的拦截器是所有请求都执行的
⑤mvc:interceptor里面配置的bean会根据mvc:mapping或者mvc:exclude-mapping配置的path来决定什么请求会执行或不执行拦截器

4、HandlerInterceptor接口的方法
(1)preHandle:
①在handler方法之前被调用
②返回值为true: 继续调用后续的其他拦截器和目标方法
③返回值为false: 不继续调用后续的其他拦截器和目标方法
④ 使用场景:权限检查、日志、事务

(2)postHandle:
①调用handler方法之后,渲染视图之前被调用
② 使用场景:修改请求域属性,修改视图

(3)afterCompletion:
①渲染视图之后被调用
②使用场景:释放资源

5、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>SpringMVC_12_Intercepter</display-name>
  <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

6、springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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-4.3.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

    <!-- 配置自动扫描包 -->
    <context:component-scan base-package="com.test.springmvc"></context:component-scan>

    <!-- 配置视图解析器,把handler返回值解析为实际视图 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <mvc:annotation-driven></mvc:annotation-driven>

    <mvc:interceptors>
        <bean class="com.test.springmvc.interceptors.Interceptor1"></bean>

        <mvc:interceptor>
            <mvc:mapping path="/testIntercepterInclude"/>
            <mvc:exclude-mapping path="/testIntercepterExclude"/>
            <bean class="com.test.springmvc.interceptors.Interceptor2"></bean>
        </mvc:interceptor>

    </mvc:interceptors>

</beans>

7、Handler.java

package com.test.springmvc.handlers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class Handler {

    @RequestMapping("/testIntercepterInclude")
    public String testIntercepterInclude() {
        System.out.println("testIntercepterInclude");
        return "index";
    }

    @RequestMapping("/testIntercepterExclude")
    public String testIntercepterExclude() {
        System.out.println("testIntercepterExclude");
        return "index";
    }
}

8、Interceptor1.java

package com.test.springmvc.interceptors;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Interceptor1 implements HandlerInterceptor{

    /*
     * 1、在handler方法之前被调用
     * 2、返回值为true: 继续调用后续的其他拦截器和目标方法
     * 3、返回值为false: 不继续调用后续的其他拦截器和目标方法
     * 
     * 使用场景:权限检查、日志、事务
     */
    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("Interceptor1-----preHandle");
        return true;
    }

    /*
     * 调用handler方法之后,渲染视图之前被调用 
     * 
     * 使用场景:修改请求域属性,修改视图
     */
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("Interceptor1-----postHandle");
    }

    /*
     * 渲染视图之后被调用
     * 
     * 使用场景:释放资源
     */
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("Interceptor1-----afterCompletion");
    }
}

9、Interceptor2.java

package com.test.springmvc.interceptors;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Interceptor2 implements HandlerInterceptor{

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        System.out.println("Interceptor2-----preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("Interceptor2-----postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("Interceptor2-----afterCompletion");
    }
}

10、index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a href="testIntercepterInclude">testIntercepterInclude</a><br><br>
    <a href="testIntercepterExclude">testIntercepterExclude</a><br><br>

    自定义拦截器运行顺序<br>
    1、按照mvc:interceptors配置的bean顺序运行<br>
    2、配置的拦截器的preHandle方法<br>
    3、被调用的handler方法<br>
    4、配置的拦截器的postHandle方法<br>
    5、配置的拦截器的afterCompletion方法<br>

    注意事项:<br>
    1、不管spring配置文件中配置了mvc:mapping或者mvc:exclude-mapping, preHandle方法都需要执行<br>
    2、mvc:mapping一定要写在mvc:exclude-mapping前面<br>
    3、mvc:exclude-mapping不能单独存在,必须要有mvc:mapping在前面,不然会报错“500 - Servlet.init() for servlet springDispatcherServlet threw exception”<br>
    4、mvc:interceptors下的bean配置的拦截器是所有请求都执行的<br>
    5、mvc:interceptor里面配置的bean会根据mvc:mapping或者mvc:exclude-mapping配置的path来决定什么请求会执行或不执行拦截器<br>
</body>
</html>

11、项目目录
项目目录

12、demo
https://download.csdn.net/download/qq_22778717/10601262

猜你喜欢

转载自blog.csdn.net/qq_22778717/article/details/81634045