servlet-mapping 路径配置 斜杠、斜杠星区别

Posted by hcy on July 23, 2019

servlet-mapping 路径配置怎么配, / /* 区别

1.匹配规则

1
2
3
4
5
6
7
/xx 表示精准匹配xx路径

*.action 表示匹配action为后缀的

/ 表示匹配所有路径,优先级较低

/* 匹配所有路径 优先级小于 /xx这种精准匹配,小于/xx/*这种路径比他更为精准的匹配 大于*.action这种后缀匹配,这将导致一些问题

2.默认servlet处理静态资源和jsp,为什么什么都不写也能访问静态资源和jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
因为: tomcat容器自带两个servlet,请查看tomcat的web.xml(非项目的),里面写着两个servlet分别是


  
//默认的servlet 名字叫default
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
  <param-name>debug</param-name>
  <param-value>0</param-value>
</init-param>
<init-param>
  <param-name>listings</param-name>
  <param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

//默认的servlet 名字叫jsp
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
  <param-name>classdebuginfo</param-name>
  <param-value>true</param-value>
</init-param>
<init-param>
  <param-name>fork</param-name>
  <param-value>false</param-value>
</init-param>
<init-param>
  <param-name>xpoweredBy</param-name>
  <param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>

他们拦截路径分别是

1
2
3
4
5
6
7
8
9
10
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
//jsp 拦截
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

可以看出default servlet 默认情况下处理webapp目录下的静态文件,比如我们放一张图片或一个css文件在webapp目录下可以直接访问 jsp servlet 处理webapp目录下的*.jsp文件,这样我们不用写任何代码就能访问jsp文件


3.配置springmvc,如何不影响静态资源访问

3.1 配置方式1

1
2
3
4
5
6
7
<servlet-mapping>
	<servlet-name>dispatcher</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>	


我们配置springmvc为  *.do 等行使的路径。这样可以将我们的请求与tomcat默认的分开,相互不影响。

3.2 配置方式2 ,我们不希望带任何后缀

1
2
3
4
5
6
7
<servlet-mapping>
	<servlet-name>dispatcher</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>	

相当于覆盖了tomcat的default servlet,这样不需要任何后缀就可以访问dispatcher,但是此时带来的后果就是,无法处理静态资源.
此时放在webapp目录下的css js jpg 等文件没有servlet处理,所以无法访问

3.2.1解决办法

1
2
3
4
5
6
7
8
9
10
11
12
我们可以将静态资源后缀指定使用default servlet拦截

<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>*.jpg</url-pattern>
</servlet-mapping>	
<servlet-mapping>
	<servlet-name>default</servlet-name>
	<url-pattern>*.css</url-pattern>
</servlet-mapping>

这样将常用后缀的静态资源主动交给deafault处理,就可以了

4 /*带来的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
一般不要将拦截范围设为 /*他将导致拦截范围过于宽,比如如下这样设置

<servlet-mapping>
	<servlet-name>A</servlet-name>
	<url-pattern>/test</url-pattern>
</servlet-mapping>

<servlet-mapping>
	<servlet-name>A1</servlet-name>
	<url-pattern>/test/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
	<servlet-name>B</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
	<servlet-name>C</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
	<servlet-name>D</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>

得到结果 请求

1
2
3
4
5
6
7
8
9
10
11
12
13
localhost/test 		-->A
localhost/test/xyz 	-->A1
localhost/xyz   	-->D
localhost/xyz.do    -->D
localhost/   		-->D


可以看到 /*的拦截优先级太高,
除了精准匹配和次精准匹配外,其他如 *.do 这种类型不起作用,/也不起作用。
从而导致默认静态文件无法访问,默认jsp文件无法访问,servlet请求转发到jsp无法实现。
从而各种404

所以千万不要使用 /*, 不想要接口链接有后缀的,可以用 3.2节的解决办法即可

转载请注明出处:https://www.huangchaoyu.com/2019/07/23/servlet-mapping-路径配置-斜杠-斜杠星区别/