ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

二、分析Spring MVC拦截器导致静态资源访问失败(基于Xml配置)

2021-01-01 18:30:08  阅读:105  来源: 互联网

标签:Xml 拦截器 静态 Spring 路径 处理 spring 资源


前言

对于这个问题,我们准备了以下三种解决方案:
1、静态资源统一交由Servlet容器直接处理;
2、静态资源统一交由Spring MVC框架间接处理,再转交给Servlet容器处理;
3、静态资源统一交由Spring MVC框架直接处理;

从这3种解决方案中,处理静态资源的方式可以分为Servlet容器处理和spring MVC框架处理。在这里要说明的是,只要静态资源的请求经过spring MVC框架的大门,如果不做额外的配置,就必然会跟拦截器扯上关系。

解决方案1:静态资源统一交由Servlet容器直接处理
在web.xml中加入以下配置即可,相关参数改为项目实际参数。一旦静态资源请求匹配后,直接由servlet容器处理。
说明:由于DispatcherServlet配置的映射路径为”/”,而映射路径的匹配顺序又是从上往下的,所以导致了servlet容器全局配置文件中提供处理静态资源的servlet没有匹配的机会,所以要处理这个问题,只要将default Servlet的映射路径以更精确的静态资源匹配路径重新注册到DispatcherServlet配置的前面即可。
参考:
在这里插入图片描述
结论:
加上default servlet的一段配置即可解决静态资源请求失败的问题,此刻与spring mvc完全没有关系,所以配置spring mvc拦截器时,不会对静态资源进行拦截。

解决方案2:
静态资源统一交由Spring MVC框架间接处理,再转交给Servlet容器处理;

个人理解如下:
源码参考
在这里插入图片描述

首先,在springmvc.xml的配置文件中加入以下标签:
在这里插入图片描述

该标签会在spring mvc容器启动过程中,将 DefaultServletHttpRequestHandler处理器以”/**”为映射路径,同时还从spring mvc容器中获取配置文件中注册的拦截器,一起绑定到SimpleUrlHandlerMapping处理器映射器中。所以,只要我们配置的拦截器映射路径能匹配静态资源的路径,那么我们请求的静态资源就一定会被拦截器拦截,至于拦截后放行还是不放行,则依据拦截器的执行逻辑决定,所以拦截器的不同执行逻辑,就有可能导致静态资源访问失败,那要解决这个问题,可以采用在拦截方法里首先进行判断是否是静态资源的请求,如果是,则返回true直接放行,也只有返回true,才有机会将静态资源交给Servlet容器来处理,虽然这种方式可以解决静态资源访问失败的问题,但拦截器却参与其中了。还有一种更好的处理方式就是不让拦截器参与工作,即在配置拦截器的时候,把我们不需要拦截的路径排除,这样,由于我们访问的静态资源路径不在拦截器的拦截范围中,自然就不会触发到拦截器了。

说明:如果采用<mvc:default-servlet-handler />这种方式处理静态资源,拦截器必须要做以下配置,否则还有可能导致静态资源无法访问。
(参考2选1)
参考1:在拦截器中放行静态资源,拦截器参与了工作
在这里插入图片描述在这里插入图片描述

参考2:在配置拦截器中排除静态资源,拦截器没有参与工作,也就不用在拦截器中判断静态资源的请求了

在这里插入图片描述

第三种解决方案:静态资源统一交由Spring MVC框架直接处理

首先,在springmvc.xml的配置文件中加入以下标签:

在这里插入图片描述

说明:该标签的location属性值可以指定任意目录,包括web-info安全目录。
该标签会在spring mvc容器启动过程中,将 ResourceHttpRequestHandler处理器以mapping属性的值作为映射路径,同时还从spring mvc容器中获取配置文件中注册的拦截器,一起绑定到SimpleUrlHandlerMapping处理器映射器中。所以,只要我们配置的拦截器映射路径能匹配静态资源的路径,那么我们请求的静态资源就一定会被拦截器拦截,至于拦截后放行还是不放行,则依据拦截器的执行逻辑决定,所以拦截器的不同执行逻辑,就有可能导致静态资源访问失败,那要解决这个问题,可以采用在拦截方法里首先进行判断是否是静态资源的请求,如果是,则返回true直接放行,也只有返回true,才有机会交给静态资源的处理器来处理,虽然这种方式可以解决静态资源访问失败的问题,但拦截器却参与其中了。还有一种更好的处理方式就是不让拦截器参与工作,即在配置拦截器的时候,把我们不需要拦截的路径排除,这样,由于我们访问的静态资源路径不在拦截器的拦截范围中,自然就不会触发到拦截器了。

说明:如果采用<mvc:resources mapping="" location=""/>这种方式处理静态资源,拦截器必须要做以下配置,否则还有可能导致静态资源无法访问。
(参考2选1)
参考1:在拦截器中放行静态资源,拦截器参与了工作
在这里插入图片描述
在这里插入图片描述

参考2:在配置拦截器中排除静态资源,拦截器没有参与工作,也就不用在拦截器中判断静态资源的请求了
在这里插入图片描述

总结:
1、如果采用第一种解决方案采用第一种解决方案,拦截器不用做任何处理静态资源的操作。因为spring mvc没有匹配静态资源的请求。
2、如果采用第二或三种解决方案,如果在xml配置文件中配置了全局自定义拦截器,就必须要在拦截器preHandle方法中最开始处判断并放行静态资源的请求或者在配置拦截器的时候直接排除静态资源的路径,这样才能解决静态资源访问失败的问题,建议在配置拦截器中排除静态资源的请求路径,减少了拦截器的执行步骤。
3、至于选择哪种解决方案,建议还是结合实际项目选择,各有优缺点。
以上内容为自己的理解所获,如有误,欢迎留言指正,谢谢!

标签:Xml,拦截器,静态,Spring,路径,处理,spring,资源
来源: https://blog.csdn.net/qq_39312911/article/details/112062501

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有