/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

问题:SpringMVC拦截器中/*和/**有什么区别?

 

咱们通过测试来得出结论。

 

首先,我写了5个拦截器:

/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

补充:拦截器的配置示例:

/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

 

然后,我又准备了5个请求路径:

@RequestMapping("/")
@RequestMapping("/one")
@RequestMapping("/one/two")
@RequestMapping("/one/two/three")
@RequestMapping("/one/two/three/four")

每个请求的方法里面都有对应的println语句,这里不展示。

 

最后,依次请求这5个路径,得到的控制台输出如下:

/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

上面的结果表明了每个请求路径能触发哪些拦截器,而我们想知道的是每个拦截器能拦截哪些请求路径。所以需要对上面这些数据作一个处理:

/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

 

从上面这个表格我们不难得出一些结论:

1、/* 能拦截 / 这个目录下的子女节点;/** 能拦截 / 这个目录下的所有后代节点。

2、/one/* 能拦截 /one 这个目录下的子女节点;/one/** 能拦截 /one 这个目录下的所有后代节点。

 

说明:

1、2其实是一回事,合起来说就是:

具体路径后面带一个*:能拦截这个具体路径的子女节点;

具体路径后面带两个*:能拦截这个具体路径的所有后代节点。

 

(看了很多国内的文章,也在*翻了一些问答,我的结论是可靠的哈~)

 

 

 


最后附上源码:

 

项目结构:

/* /** #SpringMVC拦截器中/*和/**的区别 @FDDLC

 

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>org.example</groupId>
  <artifactId>P072_Interceptor_path</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>P072_Interceptor_path Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.8.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tomcat</groupId>
      <artifactId>servlet-api</artifactId>
      <version>6.0.36</version>
    </dependency>
  </dependencies>

  <build>
    <finalName>P072_Interceptor_path</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 

web.xml的内容:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--关联springmvc.xml,让其中的配置生效!-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

 

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:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="cn.liuxingchang" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/"/>
            <bean class="cn.liuxingchang.interceptor.MyInterceptor" />
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/*"/>
            <bean class="cn.liuxingchang.interceptor.MyInterceptor2" />
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.liuxingchang.interceptor.MyInterceptor3" />
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/one/*"/>
            <bean class="cn.liuxingchang.interceptor.MyInterceptor4" />
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/one/**"/>
            <bean class="cn.liuxingchang.interceptor.MyInterceptor5" />
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

 

index.jsp的内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<a href="/">/</a><br /><br />
<a href="/one">/one</a><br /><br />
<a href="/one/two">/one/two</a><br /><br />
<a href="/one/two/three">/one/two/three</a><br /><br />
<a href="/one/two/three/four">/one/two/three/four</a><br /><br />
</body>
</html>

!!!注意:因为上面的超链接我用的是绝对路径,所以访问项目的格式要设置成:http://localhost:[端口号],比如http://localhost。不能是http://localhost/ssm这样的。

 

success.jsp的内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h3>success</h3>
</body>
</html>

 

MyInterceptor.java的内容:

package cn.liuxingchang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("/");
        return true;
    }
}

 

MyInterceptor2.java的内容:

package cn.liuxingchang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("/*");
        return true;
    }
}

 

MyInterceptor3.java的内容:

package cn.liuxingchang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor3 implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("/**");
        return true;
    }
}

 

MyInterceptor4.java的内容:

package cn.liuxingchang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor4 implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("/one/*");
        return true;
    }
}

 

MyInterceptor5.java的内容:

package cn.liuxingchang.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

public class MyInterceptor5 implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
        System.out.println("/one/**");
        return true;
    }
}

 

MyController.java的内容:

package cn.liuxingchang.controller;

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

@Controller
public class MyController {
    @RequestMapping("/")
    public String test() {
        System.out.println("request: /");
        System.out.println("----------");
        return "success";
    }

    @RequestMapping("/one")
    public String test2() {
        System.out.println("request: /one");
        System.out.println("----------");
        return "success";
    }

    @RequestMapping("/one/two")
    public String test3() {
        System.out.println("request: /one/two");
        System.out.println("----------");
        return "success";
    }

    @RequestMapping("/one/two/three")
    public String test4() {
        System.out.println("request: /one/two/three");
        System.out.println("----------");
        return "success";
    }

    @RequestMapping("/one/two/three/four")
    public String test5() {
        System.out.println("request: /one/two/three/four");
        System.out.println("----------");
        return "success";
    }
}