分享

SpringMVC 配置 问题 注意

 一本正经地胡闹 2020-04-26

1.【web.xml路径配置】

/、/*、*.do

1:*.do *.action 拦截以.do结尾的请求 (不拦截 jsp png jpg .js .css)

2:/ 拦截所有请求(不拦截.jsp) 建议使用此种 方式 (拦截 .js.css .png) (放行静态资源)

3:/* 拦截所有请求(包括.jsp) 此种方式 不建议使用

详细解释:

1、"/'表示匹配所有请求(其中包含除.jsp和.jspx外的所有后缀)。

如果不配置静态资源,它会把匹配所有请求都当做是对控制器的访问,去掉后缀进行匹配。例如你访问/main.css会变成/main,这也是造成你引入的.css,.js等静态资源无法访问的原因,因为他们都被当做控制器的路径了。

至于为什么不匹配.jsp和.jspx,是因为在tomcat的web.xml里有这样的配置:

在这里插入图片描述在这里插入图片描述

这里由于*.jsp和*.jspx的精度比"/"更高,所以被JspServlet匹配到了,而不是DispatchServlet(jsp的本质也是servlet,它只是让返回数据动态加载的html更加方便)

2、"/*"表示匹配所有请求(包含所有后缀)

这里*.jsp比"/*"的匹配度低,所以配置后会使.jsp也进入DispatcherServlet,而.jsp既不是控制器路径也不是静态资源,所以就算配了静态资源还是访问不到,所以这个/*的配置不适用于DispatcherServlet,一般用于过滤器来拦截所有资源

3、*.do表示匹配所有以.do结尾的请求

这也是比较推荐的一种配置,它只匹配.do结尾的请求,不会匹配到静态资源,静态资源可以被直接访问,省去了配置静态资源的麻烦。

总结与比较:

/的意义在于符合restful风格,restful风格的请求不能有后缀,需要像 /user/name这种,需要配置静态资源:mvc:resources或mvc:default-servlet-handler/或Tomcat的web.xml中配置DefaultServlet

/*的意义在于过滤器拦截所有资源使用,并不适用于DispatcherServlet

*.do适用于DispatcherServlet,免去了配置静态资源的麻烦,但不适用于restful风格

————————————————

转自

DispatcherServlet url-pattern中 /、/*、*.do中的区别与作用

https://blog.csdn.net/lc77777abc/article/details/88779272

2.【静态资源配置】

    <mvc:resources mapping="/js/**" location="/js/" />

    <mvc:resources mapping="/css/**" location="/css/" />

    <mvc:resources mapping="/img/**" location="/img/" />

规则:将星号部分的内容和location里的内容进行拼接。例如:mapping="/resource/img/**" location="/images/",发过来的请求为/resource/img/index/bg.png,则将index/bg.png拼接在/images/后面,/images/index/bg.png,通过这个路径去服务器中的项目根目录下(即WebRoot)找资源。

<mvc:resources />

<mvc:resources />:由Spring MVC框架自己处理静态资源,并添加一些有用的附加值功能。

<mvc:resources />允许静态资源放在任何地方,如WEB-INF目录下、类路径下等,你甚至可以将JavaScript等静态文件打到JAR包中。通过location属性指定静态资源的位置,由于location属性是Resources类型,因此可以使用诸如"classpath:"等的资源前缀指定资源位置。传统Web容器的静态资源只能放在Web容器的根路径下,<mvc:resources />完全打破了这个限制。

mvc.xml中配置:

<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>

以上配置将Web根路径"/"及类路径下 /META-INF/publicResources/ 的目录映射为/resources路径。假设Web根路径下(即WebRoot)拥有images、js这两个资源目录,在images下面有bg.gif图片,在js下面有test.js文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源。

————————————————

详细见:

【Spring框架】<mvc:default-servlet-handler/>的作用

https://www.cnblogs.com/dflmg/p/6393416.html

3.【两个星号 /**】

SpringMVC interceptor配置,path="/**" 两个星号,与path="/"以及path="/*"的区别

例如

<mvc:interceptor>

<mvc:mapping path="/**"/>

<bean class="com.web.interceptor.user.UserAuthInterceptor" />

</mvc:interceptor>

/** 的意思是所有文件夹及里面的子文件夹

/*  是所有文件夹,不含子文件夹(如果在某个请求下的子文件夹请求就不会拦截,很多ajax都不会被拦截)

 是web项目的根目录

SpringMVC拦截器中的/**是配置全部路径.现在我有一个需求,想要拦截以/user/开头的请求.我的path写为/user/**,这样就能拦截到所有的符号条件的请求.

然后我的项目需求增加了,我在项目中加入了多重权限控制并希望用拦截器去控制它.假设现在有个功能,只开放给管理员,所以我把它的访问路径设为/user/manager/xxxx/xxxx.所以我又加入了一个拦截器,希望拦截路径中存在/manager/的所有的请求.我把path写为/manager/'**,结果却不行.

user的拦截器正常,但是manager的拦截器却不工作,

原来/user/**只适用于以/user/开头的请求,/user/的前面什么都不能有,

由于我所有的请求都是/user/开头,所以user的拦截器一直都是可以正常运行的,

但是manager拦截器就不同了,我的path写为/manager/**,但是我所有带有/manager/的请求都是前面有/user/的,所以这不满足path路径中的/manager/**.当你要在这个名称的前面加其他的一个名称时,你需要/*/manager/**,如果前面有多个名称,就是/**/manager/**,当然了,由于/**是通配符,所以以manager开头的url也符合这个条件.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多