Spring中/与/*的区别

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址: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> 配置的是 /*,也将过滤所有请求。不细看的话,它们好像作用都一样,那么大家有没有想过既然都是拦截或过滤所有请求,那么为什么写法会不同呢?

关于这个问题我在网上查了很多资料,基本上他们的回答要么抄袭要么回答不全面,或者有人都不屑回答这样问题(他们认为没有必须研究这个问题),经过我认真的推敲,有些人的答案还是可以借鉴的。

这个问题我们可以回到最原始的 ServletFilter,因为 前端控制器 就是一个 Servlet字符集过滤器 就是一个 Filter,我从这方面下手,尝试写了几个 Demo,发现其实 //* 分别在 ServletFilter 中有不同的意义。并得出下列 结论

1、Servlet

  • / :它会匹配所有的路径,但是不会匹配到像 .jsp 这样的页面。如:

    • http://localhost:8080/webdemo/hello(会匹配);
    • http://localhost:8080/webdemo/hello/abc(会匹配);
    • http://localhost:8080/webdemo/hello/world.html(不会匹配)。

    你会发现只要后面有 .xxx 都不会被匹配到。

  • /* :它会匹配所有的路径和页面,上述的例子均会被匹配到。

2、Filter

  • / :它会过滤根目录,而且只会过滤根目录,不会过滤其他路径;
  • /* :它会过滤全部请求,也包括根目录。


博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



猜你喜欢

转载自blog.csdn.net/sun8112133/article/details/104819575