版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.csdn.net/sun8112133/article/details/104819575
我是在整合 SSM 框架时发现的问题,这个问题以前我从没深究过它 —— /
和 /*
的区别。
学过 Spring MVC 的小伙伴们肯定还记得,我们在配置 前端控制器 和 字符集过滤器 时,通常在 web.xml
中是这样配置的:
<!-- 前端控制器 -->
<servlet>
<servlet-name>mvc-dispatcher</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>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 字符集过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不知道大家有没有发现,在 前端控制器 中 <url-pattern>
配置的是 /
,将拦截所有请求;字符集过滤器 中 <url-pattern>
配置的是 /*
,也将过滤所有请求。不细看的话,它们好像作用都一样,那么大家有没有想过既然都是拦截或过滤所有请求,那么为什么写法会不同呢?
关于这个问题我在网上查了很多资料,基本上他们的回答要么抄袭要么回答不全面,或者有人都不屑回答这样问题(他们认为没有必须研究这个问题),经过我认真的推敲,有些人的答案还是可以借鉴的。
这个问题我们可以回到最原始的 Servlet 和 Filter,因为 前端控制器 就是一个 Servlet,字符集过滤器 就是一个 Filter,我从这方面下手,尝试写了几个 Demo,发现其实 /
和 /*
分别在 Servlet 和 Filter 中有不同的意义。并得出下列 结论:
1、Servlet
-
/
:它会匹配所有的路径,但是不会匹配到像.jsp
这样的页面。如:- http://localhost:8080/webdemo/hello(会匹配);
- http://localhost:8080/webdemo/hello/abc(会匹配);
- http://localhost:8080/webdemo/hello/world.html(不会匹配)。
你会发现只要后面有
.xxx
都不会被匹配到。 -
/*
:它会匹配所有的路径和页面,上述的例子均会被匹配到。
2、Filter
/
:它会过滤根目录,而且只会过滤根目录,不会过滤其他路径;/*
:它会过滤全部请求,也包括根目录。